aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2010-01-20 15:03:06 +0100
committerAnthony Liguori <aliguori@us.ibm.com>2010-01-27 07:52:40 -0600
commit614971158c1ee20caeffaa5845fe09d18a86b368 (patch)
tree18f5db2ff00b22e7752f7d77b176eb92e456bc56 /block/qcow2-refcount.c
parentqcow2: Allow updating no refcounts (diff)
downloadqemu-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.c31
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 {