Revision 7403b14e dma-helpers.c

b/dma-helpers.c
70 70
    qemu_bh_schedule(dbs->bh);
71 71
}
72 72

  
73
static void dma_bdrv_cb(void *opaque, int ret)
73
static void dma_bdrv_unmap(DMAAIOCB *dbs)
74 74
{
75
    DMAAIOCB *dbs = (DMAAIOCB *)opaque;
76
    target_phys_addr_t cur_addr, cur_len;
77
    void *mem;
78 75
    int i;
79 76

  
80
    dbs->acb = NULL;
81
    dbs->sector_num += dbs->iov.size / 512;
82 77
    for (i = 0; i < dbs->iov.niov; ++i) {
83 78
        cpu_physical_memory_unmap(dbs->iov.iov[i].iov_base,
84 79
                                  dbs->iov.iov[i].iov_len, !dbs->is_write,
85 80
                                  dbs->iov.iov[i].iov_len);
86 81
    }
82
}
83

  
84
void dma_bdrv_cb(void *opaque, int ret)
85
{
86
    DMAAIOCB *dbs = (DMAAIOCB *)opaque;
87
    target_phys_addr_t cur_addr, cur_len;
88
    void *mem;
89

  
90
    dbs->acb = NULL;
91
    dbs->sector_num += dbs->iov.size / 512;
92
    dma_bdrv_unmap(dbs);
87 93
    qemu_iovec_reset(&dbs->iov);
88 94

  
89 95
    if (dbs->sg_cur_index == dbs->sg->nsg || ret < 0) {
......
119 125
        dbs->acb = bdrv_aio_readv(dbs->bs, dbs->sector_num, &dbs->iov,
120 126
                                  dbs->iov.size / 512, dma_bdrv_cb, dbs);
121 127
    }
128
    if (!dbs->acb) {
129
        dma_bdrv_unmap(dbs);
130
        qemu_iovec_destroy(&dbs->iov);
131
        return;
132
    }
122 133
}
123 134

  
124 135
static BlockDriverAIOCB *dma_bdrv_io(
......
138 149
    dbs->bh = NULL;
139 150
    qemu_iovec_init(&dbs->iov, sg->nsg);
140 151
    dma_bdrv_cb(dbs, 0);
152
    if (!dbs->acb) {
153
        qemu_aio_release(dbs);
154
        return NULL;
155
    }
141 156
    return &dbs->common;
142 157
}
143 158

  

Also available in: Unified diff