sheepdog: Convert sd_aiocb_info.cancel to .cancel_async

Also drop the now unused SheepdogAIOCB.finished field. Note that this
aio is internal to sheepdog driver and has NULL cb and opaque, and
should be unused at all.

Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Fam Zheng 2014-09-11 13:41:24 +08:00 committed by Stefan Hajnoczi
parent 7691e24dbe
commit 6d24b4df38
1 changed files with 20 additions and 28 deletions

View File

@ -315,7 +315,6 @@ struct SheepdogAIOCB {
void (*aio_done_func)(SheepdogAIOCB *); void (*aio_done_func)(SheepdogAIOCB *);
bool cancelable; bool cancelable;
bool *finished;
int nr_pending; int nr_pending;
}; };
@ -446,9 +445,6 @@ static inline void free_aio_req(BDRVSheepdogState *s, AIOReq *aio_req)
static void coroutine_fn sd_finish_aiocb(SheepdogAIOCB *acb) static void coroutine_fn sd_finish_aiocb(SheepdogAIOCB *acb)
{ {
qemu_coroutine_enter(acb->coroutine, NULL); qemu_coroutine_enter(acb->coroutine, NULL);
if (acb->finished) {
*acb->finished = true;
}
qemu_aio_release(acb); qemu_aio_release(acb);
} }
@ -482,36 +478,33 @@ static void sd_aio_cancel(BlockDriverAIOCB *blockacb)
SheepdogAIOCB *acb = (SheepdogAIOCB *)blockacb; SheepdogAIOCB *acb = (SheepdogAIOCB *)blockacb;
BDRVSheepdogState *s = acb->common.bs->opaque; BDRVSheepdogState *s = acb->common.bs->opaque;
AIOReq *aioreq, *next; AIOReq *aioreq, *next;
bool finished = false;
acb->finished = &finished; if (sd_acb_cancelable(acb)) {
while (!finished) { /* Remove outstanding requests from pending and failed queues. */
if (sd_acb_cancelable(acb)) { QLIST_FOREACH_SAFE(aioreq, &s->pending_aio_head, aio_siblings,
/* Remove outstanding requests from pending and failed queues. */ next) {
QLIST_FOREACH_SAFE(aioreq, &s->pending_aio_head, aio_siblings, if (aioreq->aiocb == acb) {
next) { free_aio_req(s, aioreq);
if (aioreq->aiocb == acb) {
free_aio_req(s, aioreq);
}
} }
QLIST_FOREACH_SAFE(aioreq, &s->failed_aio_head, aio_siblings,
next) {
if (aioreq->aiocb == acb) {
free_aio_req(s, aioreq);
}
}
assert(acb->nr_pending == 0);
sd_finish_aiocb(acb);
return;
} }
aio_poll(s->aio_context, true); QLIST_FOREACH_SAFE(aioreq, &s->failed_aio_head, aio_siblings,
next) {
if (aioreq->aiocb == acb) {
free_aio_req(s, aioreq);
}
}
assert(acb->nr_pending == 0);
if (acb->common.cb) {
acb->common.cb(acb->common.opaque, -ECANCELED);
}
sd_finish_aiocb(acb);
} }
} }
static const AIOCBInfo sd_aiocb_info = { static const AIOCBInfo sd_aiocb_info = {
.aiocb_size = sizeof(SheepdogAIOCB), .aiocb_size = sizeof(SheepdogAIOCB),
.cancel = sd_aio_cancel, .cancel_async = sd_aio_cancel,
}; };
static SheepdogAIOCB *sd_aio_setup(BlockDriverState *bs, QEMUIOVector *qiov, static SheepdogAIOCB *sd_aio_setup(BlockDriverState *bs, QEMUIOVector *qiov,
@ -528,7 +521,6 @@ static SheepdogAIOCB *sd_aio_setup(BlockDriverState *bs, QEMUIOVector *qiov,
acb->aio_done_func = NULL; acb->aio_done_func = NULL;
acb->cancelable = true; acb->cancelable = true;
acb->finished = NULL;
acb->coroutine = qemu_coroutine_self(); acb->coroutine = qemu_coroutine_self();
acb->ret = 0; acb->ret = 0;
acb->nr_pending = 0; acb->nr_pending = 0;