Revision 4dcafbb1 block.c

b/block.c
2031 2031
    return ret;
2032 2032
}
2033 2033

  
2034
typedef struct BlockCompleteData {
2035
    BlockDriverCompletionFunc *cb;
2036
    void *opaque;
2037
    BlockDriverState *bs;
2038
    int64_t sector_num;
2039
    int nb_sectors;
2040
} BlockCompleteData;
2041

  
2042
static void block_complete_cb(void *opaque, int ret)
2043
{
2044
    BlockCompleteData *b = opaque;
2045

  
2046
    if (b->bs->dirty_bitmap) {
2047
        set_dirty_bitmap(b->bs, b->sector_num, b->nb_sectors, 1);
2048
    }
2049
    b->cb(b->opaque, ret);
2050
    qemu_free(b);
2051
}
2052

  
2053
static BlockCompleteData *blk_dirty_cb_alloc(BlockDriverState *bs,
2054
                                             int64_t sector_num,
2055
                                             int nb_sectors,
2056
                                             BlockDriverCompletionFunc *cb,
2057
                                             void *opaque)
2058
{
2059
    BlockCompleteData *blkdata = qemu_mallocz(sizeof(BlockCompleteData));
2060

  
2061
    blkdata->bs = bs;
2062
    blkdata->cb = cb;
2063
    blkdata->opaque = opaque;
2064
    blkdata->sector_num = sector_num;
2065
    blkdata->nb_sectors = nb_sectors;
2066

  
2067
    return blkdata;
2068
}
2069

  
2034 2070
BlockDriverAIOCB *bdrv_aio_writev(BlockDriverState *bs, int64_t sector_num,
2035 2071
                                  QEMUIOVector *qiov, int nb_sectors,
2036 2072
                                  BlockDriverCompletionFunc *cb, void *opaque)
2037 2073
{
2038 2074
    BlockDriver *drv = bs->drv;
2039 2075
    BlockDriverAIOCB *ret;
2076
    BlockCompleteData *blk_cb_data;
2040 2077

  
2041 2078
    trace_bdrv_aio_writev(bs, sector_num, nb_sectors, opaque);
2042 2079

  
......
2048 2085
        return NULL;
2049 2086

  
2050 2087
    if (bs->dirty_bitmap) {
2051
        set_dirty_bitmap(bs, sector_num, nb_sectors, 1);
2088
        blk_cb_data = blk_dirty_cb_alloc(bs, sector_num, nb_sectors, cb,
2089
                                         opaque);
2090
        cb = &block_complete_cb;
2091
        opaque = blk_cb_data;
2052 2092
    }
2053 2093

  
2054 2094
    ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors,

Also available in: Unified diff