[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 05/12] stream: move is_allocated_above to block.c
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 05/12] stream: move is_allocated_above to block.c |
Date: |
Mon, 4 Jun 2012 13:13:22 +0200 |
From: Paolo Bonzini <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
block.h | 4 ++++
block/stream.c | 53 ++---------------------------------------------------
3 files changed, 55 insertions(+), 51 deletions(-)
diff --git a/block.c b/block.c
index 7547051..c07ff39 100644
--- a/block.c
+++ b/block.c
@@ -2569,6 +2569,55 @@ int bdrv_is_allocated(BlockDriverState *bs, int64_t
sector_num, int nb_sectors,
return data.ret;
}
+/*
+ * 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.
+ *
+ */
+int coroutine_fn bdrv_co_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 && 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;
+}
+
BlockInfoList *qmp_query_block(Error **errp)
{
BlockInfoList *head = NULL, *cur_item = NULL;
diff --git a/block.h b/block.h
index 7408acc..799cf48 100644
--- a/block.h
+++ b/block.h
@@ -165,6 +165,10 @@ int coroutine_fn bdrv_co_write_zeroes(BlockDriverState
*bs, int64_t sector_num,
int nb_sectors);
int coroutine_fn bdrv_co_is_allocated(BlockDriverState *bs, int64_t sector_num,
int nb_sectors, int *pnum);
+int coroutine_fn bdrv_co_is_allocated_above(BlockDriverState *top,
+ BlockDriverState *base,
+ int64_t sector_num,
+ int nb_sectors, int *pnum);
BlockDriverState *bdrv_find_backing_image(BlockDriverState *bs,
const char *backing_file);
int bdrv_truncate(BlockDriverState *bs, int64_t offset);
diff --git a/block/stream.c b/block/stream.c
index 4490a25..811388a 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) {
--
1.7.6.5
- [Qemu-devel] [PULL 00/12] Block patches, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 01/12] qcow2: remove a line of unnecessary code, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 02/12] qcow2: fix the byte endian convertion, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 06/12] stream: move rate limiting to a separate header file, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 05/12] stream: move is_allocated_above to block.c,
Kevin Wolf <=
- [Qemu-devel] [PATCH 10/12] qcow2: Support for fixing refcount inconsistencies, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 08/12] qemu-img check -r for repairing images, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 09/12] qemu-img check: Print fixed clusters and recheck, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 07/12] Un-inline fdctrl_init_isa(), Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 03/12] block: implement is_allocated for raw, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 11/12] rbd: hook up cache options, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 04/12] stream: tweak usage of bdrv_co_is_allocated, Kevin Wolf, 2012/06/04
- [Qemu-devel] [PATCH 12/12] sheepdog: add coroutine_fn markers to coroutine functions, Kevin Wolf, 2012/06/04
- Re: [Qemu-devel] [PULL 00/12] Block patches, Anthony Liguori, 2012/06/06