diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2012-05-08 16:52:01 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2012-06-15 14:03:42 +0200 |
commit | 188a7bbf94aa53019ef7d2438c8e9d900e590091 (patch) | |
tree | 4ed1e564af1ef10bfb478e9c22c2ba6d0b13db72 /block/stream.c | |
parent | f9749f28b78be36471d3d0f5d4b6eed030f8942e (diff) |
stream: move is_allocated_above to block.c
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Diffstat (limited to 'block/stream.c')
-rw-r--r-- | block/stream.c | 53 |
1 files changed, 2 insertions, 51 deletions
diff --git a/block/stream.c b/block/stream.c index 4490a25ba2..811388a402 100644 --- a/block/stream.c +++ b/block/stream.c @@ -98,55 +98,6 @@ static void close_unused_images(BlockDriverState *top, BlockDriverState *base, top->backing_hd = base; } -/* - * Given an image chain: [BASE] -> [INTER1] -> [INTER2] -> [TOP] - * - * Return true if the given sector is allocated in any image between - * BASE and TOP (inclusive). BASE can be NULL to check if the given - * sector is allocated in any image of the chain. Return false otherwise. - * - * 'pnum' is set to the number of sectors (including and immediately following - * the specified sector) that are known to be in the same - * allocated/unallocated state. - * - */ -static int coroutine_fn is_allocated_above(BlockDriverState *top, - BlockDriverState *base, - int64_t sector_num, - int nb_sectors, int *pnum) -{ - BlockDriverState *intermediate; - int ret, n = nb_sectors; - - intermediate = top; - while (intermediate != base) { - int pnum_inter; - ret = bdrv_co_is_allocated(intermediate, sector_num, nb_sectors, - &pnum_inter); - if (ret < 0) { - return ret; - } else if (ret) { - *pnum = pnum_inter; - return 1; - } - - /* - * [sector_num, nb_sectors] is unallocated on top but intermediate - * might have - * - * [sector_num+x, nr_sectors] allocated. - */ - if (n > pnum_inter) { - n = pnum_inter; - } - - intermediate = intermediate->backing_hd; - } - - *pnum = n; - return 0; -} - static void coroutine_fn stream_run(void *opaque) { StreamBlockJob *s = opaque; @@ -196,10 +147,10 @@ wait: } else { /* Copy if allocated in the intermediate images. Limit to the * known-unallocated area [sector_num, sector_num+n). */ - ret = is_allocated_above(bs->backing_hd, base, sector_num, n, &n); + ret = bdrv_co_is_allocated_above(bs->backing_hd, base, + sector_num, n, &n); copy = (ret == 1); } - trace_stream_one_iteration(s, sector_num, n, ret); if (ret >= 0 && copy) { if (s->common.speed) { |