]> git.proxmox.com Git - qemu.git/commitdiff
qcow2: Fix L1 write error handling in qcow2_update_snapshot_refcount
authorKevin Wolf <kwolf@redhat.com>
Fri, 5 Apr 2013 10:57:10 +0000 (12:57 +0200)
committerKevin Wolf <kwolf@redhat.com>
Fri, 5 Apr 2013 16:58:05 +0000 (18:58 +0200)
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

index 47996811372986b4423f0555b67bd74cbc11fcc1..b32738f8d9ce6a8f34d2550759699ac9487a48a3 100644 (file)
@@ -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);