* [Qemu-devel] [PATCH 1/2] qcow2: Clear L2 table cache after write error @ 2010-05-20 14:48 Kevin Wolf 2010-05-20 14:48 ` [Qemu-devel] [PATCH 2/2] qcow2: Fix error handling in l2_allocate Kevin Wolf 0 siblings, 1 reply; 3+ messages in thread From: Kevin Wolf @ 2010-05-20 14:48 UTC (permalink / raw) To: qemu-devel; +Cc: kwolf If the L2 table was already updated in cache, but writing it to disk has failed, we must not continue using the changed version in the cache to stay consistent with what's on the disk. Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block/qcow2-cluster.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index c11680d..ed5c4b2 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -696,6 +696,7 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m) ret = write_l2_entries(bs, l2_table, l2_offset, l2_index, m->nb_clusters); if (ret < 0) { + qcow2_l2_cache_reset(bs); goto err; } -- 1.6.6.1 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* [Qemu-devel] [PATCH 2/2] qcow2: Fix error handling in l2_allocate 2010-05-20 14:48 [Qemu-devel] [PATCH 1/2] qcow2: Clear L2 table cache after write error Kevin Wolf @ 2010-05-20 14:48 ` Kevin Wolf 2010-05-21 9:44 ` Stefan Hajnoczi 0 siblings, 1 reply; 3+ messages in thread From: Kevin Wolf @ 2010-05-20 14:48 UTC (permalink / raw) To: qemu-devel; +Cc: kwolf 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 ^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] qcow2: Fix error handling in l2_allocate 2010-05-20 14:48 ` [Qemu-devel] [PATCH 2/2] qcow2: Fix error handling in l2_allocate Kevin Wolf @ 2010-05-21 9:44 ` Stefan Hajnoczi 0 siblings, 0 replies; 3+ messages in thread From: Stefan Hajnoczi @ 2010-05-21 9:44 UTC (permalink / raw) To: Kevin Wolf; +Cc: qemu-devel On Thu, May 20, 2010 at 3:48 PM, Kevin Wolf <kwolf@redhat.com> wrote: > 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. Looks good. Stefan ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-05-21 9:45 UTC | newest] Thread overview: 3+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-05-20 14:48 [Qemu-devel] [PATCH 1/2] qcow2: Clear L2 table cache after write error Kevin Wolf 2010-05-20 14:48 ` [Qemu-devel] [PATCH 2/2] qcow2: Fix error handling in l2_allocate Kevin Wolf 2010-05-21 9:44 ` Stefan Hajnoczi
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).