提交 5614c188 编写于 作者: S Stefan Weil 提交者: Kevin Wolf

block/qcow: Don't ignore immediate read/write and other failures

This patch is similar to 171e3d6b
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: NStefan Weil <weil@mail.berlios.de>
Signed-off-by: NKevin Wolf <kwolf@redhat.com>
上级 40a892b7
...@@ -589,8 +589,10 @@ static void qcow_aio_read_cb(void *opaque, int ret) ...@@ -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); 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_aiocb = bdrv_aio_readv(bs->backing_hd, acb->sector_num,
&acb->hd_qiov, acb->n, qcow_aio_read_cb, acb); &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
if (acb->hd_aiocb == NULL) if (acb->hd_aiocb == NULL) {
ret = -EIO;
goto done; goto done;
}
} else { } else {
/* Note: in this case, no need to wait */ /* Note: in this case, no need to wait */
memset(acb->buf, 0, 512 * acb->n); memset(acb->buf, 0, 512 * acb->n);
...@@ -598,8 +600,10 @@ static void qcow_aio_read_cb(void *opaque, int ret) ...@@ -598,8 +600,10 @@ static void qcow_aio_read_cb(void *opaque, int ret)
} }
} else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) { } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) {
/* add AIO support for compressed blocks ? */ /* 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; goto done;
}
memcpy(acb->buf, memcpy(acb->buf,
s->cluster_cache + index_in_cluster * 512, 512 * acb->n); s->cluster_cache + index_in_cluster * 512, 512 * acb->n);
goto redo; goto redo;
...@@ -614,8 +618,10 @@ static void qcow_aio_read_cb(void *opaque, int ret) ...@@ -614,8 +618,10 @@ static void qcow_aio_read_cb(void *opaque, int ret)
acb->hd_aiocb = bdrv_aio_readv(bs->file, acb->hd_aiocb = bdrv_aio_readv(bs->file,
(acb->cluster_offset >> 9) + index_in_cluster, (acb->cluster_offset >> 9) + index_in_cluster,
&acb->hd_qiov, acb->n, qcow_aio_read_cb, acb); &acb->hd_qiov, acb->n, qcow_aio_read_cb, acb);
if (acb->hd_aiocb == NULL) if (acb->hd_aiocb == NULL) {
ret = -EIO;
goto done; goto done;
}
} }
return; return;
...@@ -700,8 +706,10 @@ static void qcow_aio_write_cb(void *opaque, int ret) ...@@ -700,8 +706,10 @@ static void qcow_aio_write_cb(void *opaque, int ret)
(cluster_offset >> 9) + index_in_cluster, (cluster_offset >> 9) + index_in_cluster,
&acb->hd_qiov, acb->n, &acb->hd_qiov, acb->n,
qcow_aio_write_cb, acb); qcow_aio_write_cb, acb);
if (acb->hd_aiocb == NULL) if (acb->hd_aiocb == NULL) {
ret = -EIO;
goto done; goto done;
}
return; return;
done: done:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册