On 09.09.2016 15:31, Denis V. Lunev wrote:
They should work very similar, covering same areas if backing store is
shorter than the image. This change is necessary for the followup patch
switching to bdrv_get_block_status_above() in mirror to avoid assert
in check_block.
Signed-off-by: Denis V. Lunev <d...@openvz.org>
CC: Stefan Hajnoczi <stefa...@redhat.com>
CC: Fam Zheng <f...@redhat.com>
CC: Kevin Wolf <kw...@redhat.com>
CC: Max Reitz <mre...@redhat.com>
CC: Jeff Cody <jc...@redhat.com>
---
block/io.c | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/block/io.c b/block/io.c
index 420944d..0422123 100644
--- a/block/io.c
+++ b/block/io.c
@@ -1745,14 +1745,28 @@ static int64_t coroutine_fn
bdrv_co_get_block_status_above(BlockDriverState *bs,
assert(bs != base);
for (p = bs; p != base; p = backing_bs(p)) {
- ret = bdrv_co_get_block_status(p, sector_num, nb_sectors, pnum, file);
- if (ret < 0 || ret & BDRV_BLOCK_ALLOCATED) {
- break;
+ int sc;
+ ret = bdrv_co_get_block_status(p, sector_num, nb_sectors, &sc, file);
+ if (ret < 0) {
+ return ret;
+ } else if (ret & BDRV_BLOCK_ALLOCATED) {
+ *pnum = sc;
+ return ret;
+ }
+
+ /*
+ * [sector_num, nb_sectors] is unallocated on top but intermediate
+ * might have
+ *
+ * [sector_num+x, nr_sectors] allocated.
+ */
this comment is unrelated here, as you reduce nb_sectors (used in
bdrv_co_get_block_status() above) in the following "if"
+ if (nb_sectors > sc &&
+ (p == bs || sector_num + sc < p->total_sectors)) {
+ nb_sectors = sc;
}
- /* [sector_num, pnum] unallocated on this layer, which could be only
- * the first part of [sector_num, nb_sectors]. */
- nb_sectors = MIN(nb_sectors, *pnum);
}
+
+ *pnum = nb_sectors;
return ret;
}
--
Best regards,
Vladimir