Skip to content

Commit

Permalink
scsi: move unmap error checking to the complete callback
Browse files Browse the repository at this point in the history
This will help to account the operation in the following commit.

The difference is that we don't call scsi_disk_req_check_error() before
the 1st discard iteration anymore. That function also checks if
the request is cancelled, however it shouldn't get canceled until it
yields in blk_aio() functions anyway.
Same approach is already used for emulate_write_same.

Signed-off-by: Anton Nefedov <anton.nefedov@virtuozzo.com>
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Alberto Garcia <berto@igalia.com>
Message-id: 20190923121737.83281-7-anton.nefedov@virtuozzo.com
Signed-off-by: Max Reitz <mreitz@redhat.com>
  • Loading branch information
xantnef authored and XanClic committed Oct 10, 2019
1 parent 6d06808 commit 90ebf84
Showing 1 changed file with 6 additions and 4 deletions.
10 changes: 6 additions & 4 deletions hw/scsi/scsi-disk.c
Expand Up @@ -1610,9 +1610,6 @@ static void scsi_unmap_complete_noio(UnmapCBData *data, int ret)
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);

assert(r->req.aiocb == NULL);
if (scsi_disk_req_check_error(r, ret, false)) {
goto done;
}

if (data->count > 0) {
r->sector = ldq_be_p(&data->inbuf[0])
Expand Down Expand Up @@ -1650,7 +1647,12 @@ static void scsi_unmap_complete(void *opaque, int ret)
r->req.aiocb = NULL;

aio_context_acquire(blk_get_aio_context(s->qdev.conf.blk));
scsi_unmap_complete_noio(data, ret);
if (scsi_disk_req_check_error(r, ret, false)) {
scsi_req_unref(&r->req);
g_free(data);
} else {
scsi_unmap_complete_noio(data, ret);
}
aio_context_release(blk_get_aio_context(s->qdev.conf.blk));
}

Expand Down

0 comments on commit 90ebf84

Please sign in to comment.