qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH V2 2/2] qcow2: cancel the modification on fail i


From: Wenchao Xia
Subject: Re: [Qemu-devel] [PATCH V2 2/2] qcow2: cancel the modification on fail in qcow2_snapshot_create()
Date: Mon, 20 May 2013 10:17:50 +0800
User-agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130509 Thunderbird/17.0.6

于 2013-5-17 17:27, Stefan Hajnoczi 写道:
On Fri, May 17, 2013 at 03:56:45PM +0800, Wenchao Xia wrote:
Signed-off-by: Wenchao Xia <address@hidden>
---
  block/qcow2-snapshot.c |   17 ++++++++++++++---
  1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/block/qcow2-snapshot.c b/block/qcow2-snapshot.c
index 45da32d..033f705 100644
--- a/block/qcow2-snapshot.c
+++ b/block/qcow2-snapshot.c
@@ -367,7 +367,7 @@ int qcow2_snapshot_create(BlockDriverState *bs, 
QEMUSnapshotInfo *sn_info)
      ret = bdrv_pwrite(bs->file, sn->l1_table_offset, l1_table,
                        s->l1_size * sizeof(uint64_t));
      if (ret < 0) {
-        goto fail;
+        goto dealloc_cluster;
      }

      g_free(l1_table);
@@ -380,7 +380,7 @@ int qcow2_snapshot_create(BlockDriverState *bs, 
QEMUSnapshotInfo *sn_info)
       */
      ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset, s->l1_size, 
1);
      if (ret < 0) {
-        goto fail;
+        goto dealloc_cluster;
      }

      /* Append the new snapshot to the snapshot list */
@@ -397,7 +397,7 @@ int qcow2_snapshot_create(BlockDriverState *bs, 
QEMUSnapshotInfo *sn_info)
      if (ret < 0) {
          g_free(s->snapshots);
          s->snapshots = old_snapshot_list;
-        goto fail;
+        goto restore_refcount;
      }

      g_free(old_snapshot_list);
@@ -410,6 +410,17 @@ int qcow2_snapshot_create(BlockDriverState *bs, 
QEMUSnapshotInfo *sn_info)
  #endif
      return 0;

+restore_refcount:
+    ret = qcow2_update_snapshot_refcount(bs, s->l1_table_offset,
+                                         s->l1_size, -1);
+    if (ret < 0) {
+        /* Nothing can be done none now, need image check later */
+        error_report("qcow2: Error in restoring refcount in snapshot");
+    }
+
+dealloc_cluster:
+    qcow2_free_clusters(bs, sn->l1_table_offset, sn->l1_size);

sn->l1_size is in uint64_t units, not in bytes.

Do you have test cases to exercise these code paths?  Use blkdebug to
inject errors at the right point so that the error code path is taken.

  OK, I'll try it.

--
Best Regards

Wenchao Xia




reply via email to

[Prev in Thread] Current Thread [Next in Thread]