scsi-disk: more assertions and resets for aiocb
Leaving the aiocb to a non-NULL value leads to an assertion failure when rerror/werror are set to stop or enospc, and the operation is retried. scsi-disk checks that the aiocb member is NULL before filling it. This patch correctly resets the aiocb to NULL values everywhere, and adds the dual assertion that the aiocb was non-NULL before calling bdrv_acct_done. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4dd7c82cdb
commit
46e3f30e3c
@ -175,6 +175,8 @@ static void scsi_aio_complete(void *opaque, int ret)
|
|||||||
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
|
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
|
||||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||||
|
|
||||||
|
assert(r->req.aiocb != NULL);
|
||||||
|
r->req.aiocb = NULL;
|
||||||
bdrv_acct_done(s->qdev.conf.bs, &r->acct);
|
bdrv_acct_done(s->qdev.conf.bs, &r->acct);
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
@ -238,10 +240,9 @@ static void scsi_dma_complete(void *opaque, int ret)
|
|||||||
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
|
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
|
||||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||||
|
|
||||||
if (r->req.aiocb != NULL) {
|
assert(r->req.aiocb != NULL);
|
||||||
r->req.aiocb = NULL;
|
r->req.aiocb = NULL;
|
||||||
bdrv_acct_done(s->qdev.conf.bs, &r->acct);
|
bdrv_acct_done(s->qdev.conf.bs, &r->acct);
|
||||||
}
|
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (scsi_handle_rw_error(r, -ret)) {
|
if (scsi_handle_rw_error(r, -ret)) {
|
||||||
@ -270,10 +271,9 @@ static void scsi_read_complete(void * opaque, int ret)
|
|||||||
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
if (r->req.aiocb != NULL) {
|
assert(r->req.aiocb != NULL);
|
||||||
r->req.aiocb = NULL;
|
r->req.aiocb = NULL;
|
||||||
bdrv_acct_done(s->qdev.conf.bs, &r->acct);
|
bdrv_acct_done(s->qdev.conf.bs, &r->acct);
|
||||||
}
|
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
if (scsi_handle_rw_error(r, -ret)) {
|
if (scsi_handle_rw_error(r, -ret)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user