mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
linux-aio: Convert laio_aiocb_info.cancel to .cancel_async
Just call io_cancel (2), if it fails, it means the request is not canceled, so the event loop will eventually call qemu_laio_process_completion. In qemu_laio_process_completion, change to call the cb unconditionally. It is required by bdrv_aio_cancel_async. Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
3391f5e51c
commit
771b64daf9
1 changed files with 8 additions and 22 deletions
|
@ -85,9 +85,8 @@ static void qemu_laio_process_completion(struct qemu_laio_state *s,
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
laiocb->common.cb(laiocb->common.opaque, ret);
|
|
||||||
}
|
}
|
||||||
|
laiocb->common.cb(laiocb->common.opaque, ret);
|
||||||
|
|
||||||
qemu_aio_release(laiocb);
|
qemu_aio_release(laiocb);
|
||||||
}
|
}
|
||||||
|
@ -153,35 +152,22 @@ static void laio_cancel(BlockDriverAIOCB *blockacb)
|
||||||
struct io_event event;
|
struct io_event event;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (laiocb->ret != -EINPROGRESS)
|
if (laiocb->ret != -EINPROGRESS) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
/*
|
|
||||||
* Note that as of Linux 2.6.31 neither the block device code nor any
|
|
||||||
* filesystem implements cancellation of AIO request.
|
|
||||||
* Thus the polling loop below is the normal code path.
|
|
||||||
*/
|
|
||||||
ret = io_cancel(laiocb->ctx->ctx, &laiocb->iocb, &event);
|
ret = io_cancel(laiocb->ctx->ctx, &laiocb->iocb, &event);
|
||||||
if (ret == 0) {
|
|
||||||
laiocb->ret = -ECANCELED;
|
laiocb->ret = -ECANCELED;
|
||||||
|
if (ret != 0) {
|
||||||
|
/* iocb is not cancelled, cb will be called by the event loop later */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
laiocb->common.cb(laiocb->common.opaque, laiocb->ret);
|
||||||
* We have to wait for the iocb to finish.
|
|
||||||
*
|
|
||||||
* The only way to get the iocb status update is by polling the io context.
|
|
||||||
* We might be able to do this slightly more optimal by removing the
|
|
||||||
* O_NONBLOCK flag.
|
|
||||||
*/
|
|
||||||
while (laiocb->ret == -EINPROGRESS) {
|
|
||||||
qemu_laio_completion_cb(&laiocb->ctx->e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const AIOCBInfo laio_aiocb_info = {
|
static const AIOCBInfo laio_aiocb_info = {
|
||||||
.aiocb_size = sizeof(struct qemu_laiocb),
|
.aiocb_size = sizeof(struct qemu_laiocb),
|
||||||
.cancel = laio_cancel,
|
.cancel_async = laio_cancel,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void ioq_init(LaioQueue *io_q)
|
static void ioq_init(LaioQueue *io_q)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue