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