diff options
author | Kevin Wolf <kwolf@redhat.com> | 2010-01-20 15:03:06 +0100 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2010-01-27 07:52:40 -0600 |
commit | 614971158c1ee20caeffaa5845fe09d18a86b368 (patch) | |
tree | 18f5db2ff00b22e7752f7d77b176eb92e456bc56 /block/qcow2-refcount.c | |
parent | qcow2: Allow updating no refcounts (diff) | |
download | qemu-kvm-614971158c1ee20caeffaa5845fe09d18a86b368.tar.gz qemu-kvm-614971158c1ee20caeffaa5845fe09d18a86b368.tar.bz2 qemu-kvm-614971158c1ee20caeffaa5845fe09d18a86b368.zip |
qcow2: Don't ignore update_refcount return value
update_refcount can return errors that need to be handled by the callers.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
(cherry picked from commit db3a964fb6d66bd50faca76968479bb62ed25330)
Diffstat (limited to 'block/qcow2-refcount.c')
-rw-r--r-- | 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 08e67361f..e343bfbb4 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; @@ -415,9 +414,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; } @@ -464,7 +467,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(); + } } /* @@ -574,9 +583,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 { |