Re: [Qemu-devel] [PATCH 09/10] qcow2: Don't ignore update_refcount return value

2010-01-19 Thread Christoph Hellwig
Looks good,


Reviewed-by: Christoph Hellwig h...@lst.de




[Qemu-devel] [PATCH 09/10] qcow2: Don't ignore update_refcount return value

2010-01-18 Thread Kevin Wolf
update_refcount can return errors that need to be handled by the callers.

Signed-off-by: Kevin Wolf kw...@redhat.com
---
 block/qcow2-refcount.c |   31 +++
 1 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c
index 3dfadf1..b9a825b 100644
--- a/block/qcow2-refcount.c
+++ b/block/qcow2-refcount.c
@@ -269,9 +269,8 @@ static int write_refcount_block_entries(BDRVQcowState *s,
 }
 
 /* XXX: cache several refcount block clusters ? */
-static int update_refcount(BlockDriverState *bs,
-int64_t offset, int64_t length,
-int addend)
+static int QEMU_WARN_UNUSED_RESULT update_refcount(BlockDriverState *bs,
+int64_t offset, int64_t length, int addend)
 {
 BDRVQcowState *s = bs-opaque;
 int64_t start, last, cluster_offset;
@@ -413,9 +412,13 @@ retry:
 int64_t qcow2_alloc_clusters(BlockDriverState *bs, int64_t size)
 {
 int64_t offset;
+int ret;
 
 offset = alloc_clusters_noref(bs, size);
-update_refcount(bs, offset, size, 1);
+ret = update_refcount(bs, offset, size, 1);
+if (ret  0) {
+return ret;
+}
 return offset;
 }
 
@@ -462,7 +465,13 @@ int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
 void qcow2_free_clusters(BlockDriverState *bs,
   int64_t offset, int64_t size)
 {
-update_refcount(bs, offset, size, -1);
+int ret;
+
+ret = update_refcount(bs, offset, size, -1);
+if (ret  0) {
+fprintf(stderr, qcow2_free_clusters failed: %s\n, strerror(-ret));
+abort();
+}
 }
 
 /*
@@ -571,9 +580,15 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
 if (offset  QCOW_OFLAG_COMPRESSED) {
 nb_csectors = ((offset  s-csize_shift) 
s-csize_mask) + 1;
-if (addend != 0)
-update_refcount(bs, (offset  
s-cluster_offset_mask)  ~511,
-nb_csectors * 512, addend);
+if (addend != 0) {
+int ret;
+ret = update_refcount(bs,
+(offset  s-cluster_offset_mask)  ~511,
+nb_csectors * 512, addend);
+if (ret  0) {
+goto fail;
+}
+}
 /* compressed clusters are never modified */
 refcount = 2;
 } else {
-- 
1.6.2.5