From d663640c04f2aab810915c556390211d75457704 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Wed, 4 Sep 2013 19:00:25 +0200 Subject: block: expect errors from bdrv_co_is_allocated Some bdrv_is_allocated callers do not expect errors, but the fallback in qcow2.c might make other callers trip on assertion failures or infinite loops. Fix the callers to always look for errors. Cc: qemu-stable@nongnu.org Reviewed-by: Eric Blake Signed-off-by: Paolo Bonzini Signed-off-by: Stefan Hajnoczi --- block/cow.c | 6 +++++- block/qcow2.c | 4 +--- block/stream.c | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) (limited to 'block') diff --git a/block/cow.c b/block/cow.c index f4eca10..7450801 100644 --- a/block/cow.c +++ b/block/cow.c @@ -212,7 +212,11 @@ static int coroutine_fn cow_read(BlockDriverState *bs, int64_t sector_num, int ret, n; while (nb_sectors > 0) { - if (cow_co_is_allocated(bs, sector_num, nb_sectors, &n)) { + ret = cow_co_is_allocated(bs, sector_num, nb_sectors, &n); + if (ret < 0) { + return ret; + } + if (ret) { ret = bdrv_pread(bs->file, s->cow_sectors_offset + sector_num * 512, buf, n * 512); diff --git a/block/qcow2.c b/block/qcow2.c index 4d7bd78..cf03a14 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -696,13 +696,11 @@ static int coroutine_fn qcow2_co_is_allocated(BlockDriverState *bs, int ret; *pnum = nb_sectors; - /* FIXME We can get errors here, but the bdrv_co_is_allocated interface - * can't pass them on today */ qemu_co_mutex_lock(&s->lock); ret = qcow2_get_cluster_offset(bs, sector_num << 9, pnum, &cluster_offset); qemu_co_mutex_unlock(&s->lock); if (ret < 0) { - *pnum = 0; + return ret; } return (cluster_offset != 0) || (ret == QCOW2_CLUSTER_ZERO); diff --git a/block/stream.c b/block/stream.c index e640bc5..078ce4a 100644 --- a/block/stream.c +++ b/block/stream.c @@ -124,7 +124,7 @@ wait: if (ret == 1) { /* Allocated in the top, no need to copy. */ copy = false; - } else { + } else if (ret >= 0) { /* Copy if allocated in the intermediate images. Limit to the * known-unallocated area [sector_num, sector_num+n). */ ret = bdrv_is_allocated_above(bs->backing_hd, base, -- cgit v1.1