Revision cb144ccb dma-helpers.c

b/dma-helpers.c
47 47
    target_phys_addr_t sg_cur_byte;
48 48
    QEMUIOVector iov;
49 49
    QEMUBH *bh;
50
    DMAIOFunc *io_func;
50 51
} DMAAIOCB;
51 52

  
52 53
static void dma_bdrv_cb(void *opaque, int ret);
......
116 117
        return;
117 118
    }
118 119

  
119
    if (dbs->is_write) {
120
        dbs->acb = bdrv_aio_writev(dbs->bs, dbs->sector_num, &dbs->iov,
121
                                   dbs->iov.size / 512, dma_bdrv_cb, dbs);
122
    } else {
123
        dbs->acb = bdrv_aio_readv(dbs->bs, dbs->sector_num, &dbs->iov,
124
                                  dbs->iov.size / 512, dma_bdrv_cb, dbs);
125
    }
120
    dbs->acb = dbs->io_func(dbs->bs, dbs->sector_num, &dbs->iov,
121
                            dbs->iov.size / 512, dma_bdrv_cb, dbs);
126 122
    if (!dbs->acb) {
127 123
        dma_bdrv_unmap(dbs);
128 124
        qemu_iovec_destroy(&dbs->iov);
......
144 140
    .cancel             = dma_aio_cancel,
145 141
};
146 142

  
147
static BlockDriverAIOCB *dma_bdrv_io(
143
BlockDriverAIOCB *dma_bdrv_io(
148 144
    BlockDriverState *bs, QEMUSGList *sg, uint64_t sector_num,
149
    BlockDriverCompletionFunc *cb, void *opaque,
150
    int is_write)
145
    DMAIOFunc *io_func, BlockDriverCompletionFunc *cb,
146
    void *opaque, int is_write)
151 147
{
152
    DMAAIOCB *dbs =  qemu_aio_get(&dma_aio_pool, bs, cb, opaque);
148
    DMAAIOCB *dbs = qemu_aio_get(&dma_aio_pool, bs, cb, opaque);
153 149

  
154 150
    dbs->acb = NULL;
155 151
    dbs->bs = bs;
......
158 154
    dbs->sg_cur_index = 0;
159 155
    dbs->sg_cur_byte = 0;
160 156
    dbs->is_write = is_write;
157
    dbs->io_func = io_func;
161 158
    dbs->bh = NULL;
162 159
    qemu_iovec_init(&dbs->iov, sg->nsg);
163 160
    dma_bdrv_cb(dbs, 0);
......
173 170
                                QEMUSGList *sg, uint64_t sector,
174 171
                                void (*cb)(void *opaque, int ret), void *opaque)
175 172
{
176
    return dma_bdrv_io(bs, sg, sector, cb, opaque, 0);
173
    return dma_bdrv_io(bs, sg, sector, bdrv_aio_readv, cb, opaque, 0);
177 174
}
178 175

  
179 176
BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs,
180 177
                                 QEMUSGList *sg, uint64_t sector,
181 178
                                 void (*cb)(void *opaque, int ret), void *opaque)
182 179
{
183
    return dma_bdrv_io(bs, sg, sector, cb, opaque, 1);
180
    return dma_bdrv_io(bs, sg, sector, bdrv_aio_writev, cb, opaque, 1);
184 181
}

Also available in: Unified diff