diff options
author | Stefan Weil <weil@mail.berlios.de> | 2011-02-19 22:18:12 +0100 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2011-03-15 13:21:14 +0100 |
commit | 5614c188c65a8194ae499cb16400cab690a45299 (patch) | |
tree | 6c96dfc7e5a6dbea0aad3ce43a30134f66ef2b22 | |
parent | 40a892b78c9a620bc5ace4164dd566764c35cb53 (diff) |
block/qcow: Don't ignore immediate read/write and other failures
This patch is similar to 171e3d6b9997c98a97d0c525867f7cd9b640cadd
which fixed qcow2:
Returning -EIO is far from optimal, but at least it's an error code.
In addition to read/write failures, -EIO is also returned when
decompress_cluster failed.
Cc: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Stefan Weil <weil@mail.berlios.de>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
-rw-r--r-- | block/qcow.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/block/qcow.c b/block/qcow.c index f67d3d39f2..a26c88620f 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -589,8 +589,10 @@ static void qcow_aio_read_cb(void *opaque, int ret) qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); acb->hd_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num, &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb); - if (acb->hd_aiocb == NULL) + if (acb->hd_aiocb == NULL) { + ret = -EIO; goto done; + } } else { /* Note: in this case, no need to wait */ memset(acb->buf, 0, 512 * acb->n); @@ -598,8 +600,10 @@ static void qcow_aio_read_cb(void *opaque, int ret) } } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) { /* add AIO support for compressed blocks ? */ - if (decompress_cluster(bs, acb->cluster_offset) < 0) + if (decompress_cluster(bs, acb->cluster_offset) < 0) { + ret = -EIO; goto done; + } memcpy(acb->buf, s->cluster_cache + index_in_cluster * 512, 512 * acb->n); goto redo; @@ -614,8 +618,10 @@ static void qcow_aio_read_cb(void *opaque, int ret) acb->hd_aiocb = bdrv_aio_readv(bs->file, (acb->cluster_offset >> 9) + index_in_cluster, &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb); - if (acb->hd_aiocb == NULL) + if (acb->hd_aiocb == NULL) { + ret = -EIO; goto done; + } } return; @@ -700,8 +706,10 @@ static void qcow_aio_write_cb(void *opaque, int ret) (cluster_offset >> 9) + index_in_cluster, &acb->hd_qiov, acb->n, qcow_aio_write_cb, acb); - if (acb->hd_aiocb == NULL) + if (acb->hd_aiocb == NULL) { + ret = -EIO; goto done; + } return; done: |