Revision 6bbff9a0 block.c

b/block.c
147 147
        bdrv->bdrv_read = bdrv_read_em;
148 148
        bdrv->bdrv_write = bdrv_write_em;
149 149
    }
150
    aio_pool_init(&bdrv->aio_pool, bdrv->aiocb_size, bdrv->bdrv_aio_cancel);
150 151
    bdrv->next = first_drv;
151 152
    first_drv = bdrv;
152 153
}
......
1371 1372

  
1372 1373
void bdrv_aio_cancel(BlockDriverAIOCB *acb)
1373 1374
{
1374
    BlockDriver *drv = acb->bs->drv;
1375

  
1376 1375
    if (acb->cb == bdrv_aio_rw_vector_cb) {
1377 1376
        VectorTranslationState *s = acb->opaque;
1378 1377
        acb = s->aiocb;
1379 1378
    }
1380 1379

  
1381
    drv->bdrv_aio_cancel(acb);
1380
    acb->pool->cancel(acb);
1382 1381
}
1383 1382

  
1384 1383

  
......
1496 1495
    bdrv_register(&bdrv_nbd);
1497 1496
}
1498 1497

  
1499
void *qemu_aio_get(BlockDriverState *bs, BlockDriverCompletionFunc *cb,
1500
                   void *opaque)
1498
void aio_pool_init(AIOPool *pool, int aiocb_size,
1499
                   void (*cancel)(BlockDriverAIOCB *acb))
1500
{
1501
    pool->aiocb_size = aiocb_size;
1502
    pool->cancel = cancel;
1503
    pool->free_aiocb = NULL;
1504
}
1505

  
1506
void *qemu_aio_get_pool(AIOPool *pool, BlockDriverState *bs,
1507
                        BlockDriverCompletionFunc *cb, void *opaque)
1501 1508
{
1502
    BlockDriver *drv;
1503 1509
    BlockDriverAIOCB *acb;
1504 1510

  
1505
    drv = bs->drv;
1506
    if (drv->free_aiocb) {
1507
        acb = drv->free_aiocb;
1508
        drv->free_aiocb = acb->next;
1511
    if (pool->free_aiocb) {
1512
        acb = pool->free_aiocb;
1513
        pool->free_aiocb = acb->next;
1509 1514
    } else {
1510
        acb = qemu_mallocz(drv->aiocb_size);
1515
        acb = qemu_mallocz(pool->aiocb_size);
1516
        acb->pool = pool;
1511 1517
    }
1512 1518
    acb->bs = bs;
1513 1519
    acb->cb = cb;
......
1515 1521
    return acb;
1516 1522
}
1517 1523

  
1524
void *qemu_aio_get(BlockDriverState *bs, BlockDriverCompletionFunc *cb,
1525
                   void *opaque)
1526
{
1527
    return qemu_aio_get_pool(&bs->drv->aio_pool, bs, cb, opaque);
1528
}
1529

  
1518 1530
void qemu_aio_release(void *p)
1519 1531
{
1520
    BlockDriverAIOCB *acb = p;
1521
    BlockDriver *drv = acb->bs->drv;
1522
    acb->next = drv->free_aiocb;
1523
    drv->free_aiocb = acb;
1532
    BlockDriverAIOCB *acb = (BlockDriverAIOCB *)p;
1533
    AIOPool *pool = acb->pool;
1534
    acb->next = pool->free_aiocb;
1535
    pool->free_aiocb = acb;
1524 1536
}
1525 1537

  
1526 1538
/**************************************************************/

Also available in: Unified diff