qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: anthony@codemonkey.ws
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 02/14] qcow2: Fix error handling in l2_allocate
Date: Fri, 28 May 2010 18:46:01 +0200	[thread overview]
Message-ID: <1275065173-24045-3-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1275065173-24045-1-git-send-email-kwolf@redhat.com>

l2_allocate has some intermediate states in which the image is inconsistent.
Change the order to write to the L1 table only after the new L2 table has
successfully been initialized.

Also reset the L2 cache in failure case, it's very likely wrong.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block/qcow2-cluster.c |   23 +++++++++++++----------
 1 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index ed5c4b2..244b4a7 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -239,14 +239,6 @@ static int l2_allocate(BlockDriverState *bs, int l1_index, uint64_t **table)
         return l2_offset;
     }
 
-    /* update the L1 entry */
-
-    s->l1_table[l1_index] = l2_offset | QCOW_OFLAG_COPIED;
-    ret = write_l1_entry(bs, l1_index);
-    if (ret < 0) {
-        return ret;
-    }
-
     /* allocate a new entry in the l2 cache */
 
     min_index = l2_cache_new_entry(bs);
@@ -261,7 +253,7 @@ static int l2_allocate(BlockDriverState *bs, int l1_index, uint64_t **table)
         ret = bdrv_pread(bs->file, old_l2_offset, l2_table,
             s->l2_size * sizeof(uint64_t));
         if (ret < 0) {
-            return ret;
+            goto fail;
         }
     }
     /* write the l2 table to the file */
@@ -269,7 +261,14 @@ static int l2_allocate(BlockDriverState *bs, int l1_index, uint64_t **table)
     ret = bdrv_pwrite(bs->file, l2_offset, l2_table,
         s->l2_size * sizeof(uint64_t));
     if (ret < 0) {
-        return ret;
+        goto fail;
+    }
+
+    /* update the L1 entry */
+    s->l1_table[l1_index] = l2_offset | QCOW_OFLAG_COPIED;
+    ret = write_l1_entry(bs, l1_index);
+    if (ret < 0) {
+        goto fail;
     }
 
     /* update the l2 cache entry */
@@ -279,6 +278,10 @@ static int l2_allocate(BlockDriverState *bs, int l1_index, uint64_t **table)
 
     *table = l2_table;
     return 0;
+
+fail:
+    qcow2_l2_cache_reset(bs);
+    return ret;
 }
 
 static int count_contiguous_clusters(uint64_t nb_clusters, int cluster_size,
-- 
1.6.6.1

  parent reply	other threads:[~2010-05-28 16:46 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-28 16:45 [Qemu-devel] [PULL 00/14] Block patches Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 01/14] qcow2: Clear L2 table cache after write error Kevin Wolf
2010-05-28 16:46 ` Kevin Wolf [this message]
2010-05-28 16:46 ` [Qemu-devel] [PATCH 03/14] block: Fix multiwrite with overlapping requests Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 04/14] qemu-io: Add multiwrite command Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 05/14] add support for protocol driver create_options Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 06/14] drive: allow rerror, werror and readonly for if=none Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 07/14] posix-aio-compat: Expand tabs that have crept in Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 08/14] block.h: Make BDRV_SECTOR_SIZE 64 bit safe Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 09/14] qcow2: Allow qcow2_get_cluster_offset to return errors Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 10/14] qcow2: Change l2_load to return 0/-errno Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 11/14] qcow2: Return right error code in write_refcount_block_entries Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 12/14] qcow2: Fix corruption after refblock allocation Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 13/14] qcow2: Fix corruption after error in update_refcount Kevin Wolf
2010-05-28 16:46 ` [Qemu-devel] [PATCH 14/14] block: Add missing bdrv_delete() for SG_IO BlockDriver in find_image_format() Kevin Wolf
2010-05-28 16:48 ` [Qemu-devel] Re: [PULL 00/14] Block patches Anthony Liguori
2010-05-28 16:51   ` Kevin Wolf
2010-05-28 16:55     ` Anthony Liguori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1275065173-24045-3-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=anthony@codemonkey.ws \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).