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>
This commit is contained in:
Kevin Wolf 2010-01-20 15:03:06 +01:00 committed by Anthony Liguori
parent 7322afe7ea
commit db3a964fb6

View file

@ -269,9 +269,8 @@ static int write_refcount_block_entries(BDRVQcowState *s,
} }
/* XXX: cache several refcount block clusters ? */ /* XXX: cache several refcount block clusters ? */
static int update_refcount(BlockDriverState *bs, static int QEMU_WARN_UNUSED_RESULT update_refcount(BlockDriverState *bs,
int64_t offset, int64_t length, int64_t offset, int64_t length, int addend)
int addend)
{ {
BDRVQcowState *s = bs->opaque; BDRVQcowState *s = bs->opaque;
int64_t start, last, cluster_offset; int64_t start, last, cluster_offset;
@ -415,9 +414,13 @@ retry:
int64_t qcow2_alloc_clusters(BlockDriverState *bs, int64_t size) int64_t qcow2_alloc_clusters(BlockDriverState *bs, int64_t size)
{ {
int64_t offset; int64_t offset;
int ret;
offset = alloc_clusters_noref(bs, size); 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; return offset;
} }
@ -464,7 +467,13 @@ int64_t qcow2_alloc_bytes(BlockDriverState *bs, int size)
void qcow2_free_clusters(BlockDriverState *bs, void qcow2_free_clusters(BlockDriverState *bs,
int64_t offset, int64_t size) 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();
}
} }
/* /*
@ -573,9 +582,15 @@ int qcow2_update_snapshot_refcount(BlockDriverState *bs,
if (offset & QCOW_OFLAG_COMPRESSED) { if (offset & QCOW_OFLAG_COMPRESSED) {
nb_csectors = ((offset >> s->csize_shift) & nb_csectors = ((offset >> s->csize_shift) &
s->csize_mask) + 1; s->csize_mask) + 1;
if (addend != 0) if (addend != 0) {
update_refcount(bs, (offset & s->cluster_offset_mask) & ~511, int ret;
nb_csectors * 512, addend); ret = update_refcount(bs,
(offset & s->cluster_offset_mask) & ~511,
nb_csectors * 512, addend);
if (ret < 0) {
goto fail;
}
}
/* compressed clusters are never modified */ /* compressed clusters are never modified */
refcount = 2; refcount = 2;
} else { } else {