* [Qemu-devel] [PATCH 0/2] qcow2: Internal snapshot error handling fixes
@ 2013-04-05 11:04 Kevin Wolf
2013-04-05 11:04 ` [Qemu-devel] [PATCH 1/2] qcow2: Return real error in qcow2_update_snapshot_refcount Kevin Wolf
2013-04-05 11:04 ` [Qemu-devel] [PATCH 2/2] qcow2: Fix L1 write error handling " Kevin Wolf
0 siblings, 2 replies; 3+ messages in thread
From: Kevin Wolf @ 2013-04-05 11:04 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf
Kevin Wolf (2):
qcow2: Return real error in qcow2_update_snapshot_refcount
qcow2: Fix L1 write error handling in qcow2_update_snapshot_refcount
block/qcow2-refcount.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
--
1.8.1.4
^ permalink raw reply [flat|nested] 3+ messages in thread
* [Qemu-devel] [PATCH 1/2] qcow2: Return real error in qcow2_update_snapshot_refcount
2013-04-05 11:04 [Qemu-devel] [PATCH 0/2] qcow2: Internal snapshot error handling fixes Kevin Wolf
@ 2013-04-05 11:04 ` Kevin Wolf
2013-04-05 11:04 ` [Qemu-devel] [PATCH 2/2] qcow2: Fix L1 write error handling " Kevin Wolf
1 sibling, 0 replies; 3+ messages in thread
From: Kevin Wolf @ 2013-04-05 11:04 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf
This fixes the error message triggered by the following script:
cat > /tmp/blkdebug.cfg <<EOF
[inject-error]
event = "cluster_free"
errno = "28"
immediately = "off"
EOF
$qemu_img create -f qcow2 test.qcow2 10G
$qemu_img snapshot -c snap test.qcow2
$qemu_img snapshot -d snap blkdebug:/tmp/blkdebug.cfg:test.qcow2
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/qcow2-refcount.c | 11 +++++------
1 file changed, 5 insertions(+), 6 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index c38e970..4799681 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -747,10 +747,9 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
if (l1_table_offset != s->l1_table_offset) {
l1_table = g_malloc0(align_offset(l1_size2, 512));
l1_allocated = 1;
- if (bdrv_pread(bs->file, l1_table_offset,
- l1_table, l1_size2) != l1_size2)
- {
- ret = -EIO;
+
+ ret = bdrv_pread(bs->file, l1_table_offset, l1_table, l1_size2);
+ if (ret < 0) {
goto fail;
}
@@ -802,7 +801,7 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
}
if (refcount < 0) {
- ret = -EIO;
+ ret = refcount;
goto fail;
}
}
@@ -833,7 +832,7 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
refcount = get_refcount(bs, l2_offset >> s->cluster_bits);
}
if (refcount < 0) {
- ret = -EIO;
+ ret = refcount;
goto fail;
} else if (refcount == 1) {
l2_offset |= QCOW_OFLAG_COPIED;
--
1.8.1.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [Qemu-devel] [PATCH 2/2] qcow2: Fix L1 write error handling in qcow2_update_snapshot_refcount
2013-04-05 11:04 [Qemu-devel] [PATCH 0/2] qcow2: Internal snapshot error handling fixes Kevin Wolf
2013-04-05 11:04 ` [Qemu-devel] [PATCH 1/2] qcow2: Return real error in qcow2_update_snapshot_refcount Kevin Wolf
@ 2013-04-05 11:04 ` Kevin Wolf
1 sibling, 0 replies; 3+ messages in thread
From: Kevin Wolf @ 2013-04-05 11:04 UTC (permalink / raw)
To: qemu-devel; +Cc: kwolf
It ignored the error code, and at least the 'goto fail' is obvious
nonsense as it creates an endless loop (if the next attempt doesn't
magically succeed) and leaves the in-memory L1 table in big-endian
instead of converting it back.
In error cases, there's no point in writing an updated L1 table, so
skip this part for them.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/qcow2-refcount.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 4799681..b32738f 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -851,14 +851,16 @@ fail:
}
/* Update L1 only if it isn't deleted anyway (addend = -1) */
- if (addend >= 0 && l1_modified) {
- for(i = 0; i < l1_size; i++)
+ if (ret == 0 && addend >= 0 && l1_modified) {
+ for (i = 0; i < l1_size; i++) {
cpu_to_be64s(&l1_table[i]);
- if (bdrv_pwrite_sync(bs->file, l1_table_offset, l1_table,
- l1_size2) < 0)
- goto fail;
- for(i = 0; i < l1_size; i++)
+ }
+
+ ret = bdrv_pwrite_sync(bs->file, l1_table_offset, l1_table, l1_size2);
+
+ for (i = 0; i < l1_size; i++) {
be64_to_cpus(&l1_table[i]);
+ }
}
if (l1_allocated)
g_free(l1_table);
--
1.8.1.4
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-04-05 11:15 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-05 11:04 [Qemu-devel] [PATCH 0/2] qcow2: Internal snapshot error handling fixes Kevin Wolf
2013-04-05 11:04 ` [Qemu-devel] [PATCH 1/2] qcow2: Return real error in qcow2_update_snapshot_refcount Kevin Wolf
2013-04-05 11:04 ` [Qemu-devel] [PATCH 2/2] qcow2: Fix L1 write error handling " Kevin Wolf
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).