* [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block @ 2016-01-05 8:11 Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 01/15] block: Add "file" output parameter to block status query functions Fam Zheng ` (14 more replies) 0 siblings, 15 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini v5: Address Max's review comments: - "It's" -> "Its" in commit message in patch 1; - Retain the "bs->file" condition to unbreak iotest 102 in patch 1; - Fix comment of BDRV_BLOCK_OFFSET_VALID in patch 1; - Fix VMDK's compressed case in patch 11; - Add patch 12 in complement of patch 1. v4: Rebase and resend, adding Eric's and Stefan's reviewed-by. Fix one typo in patch 13. Drop previous patch 14 for a later rework because it is not a hard requirement, but it is pending on Eric's QAPI-to-JSON visitor series: https://lists.gnu.org/archive/html/qemu-devel/2015-12/msg03929.html Original cover letter --------------------- I stumbled upon this when looking at external bitmap formats. Current "qemu-img map" command only displays filename if the data is allocated in bs (bs->file) itself, or in the backing chain. Otherwise, it displays an unfriendly error message: $ qemu-img create -f vmdk -o subformat=monolithicFlat /tmp/test.vmdk 1G $ qemu-img map /tmp/test.vmdk Offset Length Mapped to File qemu-img: File contains external, encrypted or compressed clusters. This can be improved. This series extends the .bdrv_co_get_block_status callback, to let block driver return the BDS of file; then updates all driver to implement it; and lastly, it changes qemu-img to use this information in "map" command: $ qemu-img map /tmp/test.vmdk Offset Length Mapped to File 0 0x40000000 0 /tmp/test-flat.vmdk $ qemu-img map --output json /tmp/test.vmdk [{"length": 1073741824, "start": 0, "zero": false, "offset": 0, "depth": 0, "file": "/tmp/test-flat.vmdk", "data": true} ] Fam Zheng (15): block: Add "file" output parameter to block status query functions qcow: Assign bs->file->bs to file in qcow_co_get_block_status qcow2: Assign bs->file->bs to file in qcow2_co_get_block_status raw: Assign bs to file in raw_co_get_block_status iscsi: Assign bs to file in iscsi_co_get_block_status parallels: Assign bs->file->bs to file in parallels_co_get_block_status qed: Assign bs->file->bs to file in bdrv_qed_co_get_block_status sheepdog: Assign bs to file in sd_co_get_block_status vdi: Assign bs->file->bs to file in vdi_co_get_block_status vpc: Assign bs->file->bs to file in vpc_co_get_block_status vmdk: Return extent's file in bdrv_get_block_status block: Remove the "bs->file" test in bdrv_co_get_block_status qemu-img: In "map", use the returned "file" from bdrv_get_block_status qemu-img: Make MapEntry a QAPI struct iotests: Add "qemu-img map" test for VMDK extents block/io.c | 42 ++++++++++++++++--------- block/iscsi.c | 9 ++++-- block/mirror.c | 3 +- block/parallels.c | 3 +- block/qcow.c | 3 +- block/qcow2.c | 3 +- block/qed.c | 6 +++- block/raw-posix.c | 4 ++- block/raw_bsd.c | 4 ++- block/sheepdog.c | 5 ++- block/vdi.c | 3 +- block/vmdk.c | 12 ++++--- block/vpc.c | 4 ++- block/vvfat.c | 2 +- include/block/block.h | 9 ++++-- include/block/block_int.h | 3 +- qapi/block-core.json | 27 ++++++++++++++++ qemu-img.c | 78 ++++++++++++++++++++++++++++------------------ tests/qemu-iotests/059 | 10 ++++++ tests/qemu-iotests/059.out | 38 ++++++++++++++++++++++ 20 files changed, 201 insertions(+), 67 deletions(-) -- 2.4.3 ^ permalink raw reply [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 01/15] block: Add "file" output parameter to block status query functions 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-06 16:43 ` Max Reitz 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 02/15] qcow: Assign bs->file->bs to file in qcow_co_get_block_status Fam Zheng ` (13 subsequent siblings) 14 siblings, 1 reply; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini The added parameter can be used to return the BDS pointer which the valid offset is referring to. Its value should be ignored unless BDRV_BLOCK_OFFSET_VALID in ret is set. Until block drivers fill in the right value, let's clear it explicitly right before calling .bdrv_get_block_status. The "bs->file" condition in bdrv_co_get_block_status is kept now to keep iotest case 102 passing, and will be fixed once all drivers return the right file pointer. Signed-off-by: Fam Zheng <famz@redhat.com> --- block/io.c | 42 ++++++++++++++++++++++++++++-------------- block/iscsi.c | 6 ++++-- block/mirror.c | 3 ++- block/parallels.c | 2 +- block/qcow.c | 2 +- block/qcow2.c | 2 +- block/qed.c | 3 ++- block/raw-posix.c | 3 ++- block/raw_bsd.c | 3 ++- block/sheepdog.c | 2 +- block/vdi.c | 2 +- block/vmdk.c | 2 +- block/vpc.c | 2 +- block/vvfat.c | 2 +- include/block/block.h | 9 ++++++--- include/block/block_int.h | 3 ++- qemu-img.c | 7 +++++-- 17 files changed, 61 insertions(+), 34 deletions(-) diff --git a/block/io.c b/block/io.c index 63e3678..492c291 100644 --- a/block/io.c +++ b/block/io.c @@ -663,6 +663,7 @@ int bdrv_write_zeroes(BlockDriverState *bs, int64_t sector_num, int bdrv_make_zero(BlockDriverState *bs, BdrvRequestFlags flags) { int64_t target_sectors, ret, nb_sectors, sector_num = 0; + BlockDriverState *file; int n; target_sectors = bdrv_nb_sectors(bs); @@ -675,7 +676,7 @@ int bdrv_make_zero(BlockDriverState *bs, BdrvRequestFlags flags) if (nb_sectors <= 0) { return 0; } - ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &n); + ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &n, &file); if (ret < 0) { error_report("error getting block status at sector %" PRId64 ": %s", sector_num, strerror(-ret)); @@ -1464,6 +1465,7 @@ int bdrv_flush_all(void) typedef struct BdrvCoGetBlockStatusData { BlockDriverState *bs; BlockDriverState *base; + BlockDriverState **file; int64_t sector_num; int nb_sectors; int *pnum; @@ -1488,7 +1490,8 @@ typedef struct BdrvCoGetBlockStatusData { */ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, int64_t sector_num, - int nb_sectors, int *pnum) + int nb_sectors, int *pnum, + BlockDriverState **file) { int64_t total_sectors; int64_t n; @@ -1518,16 +1521,19 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, return ret; } - ret = bs->drv->bdrv_co_get_block_status(bs, sector_num, nb_sectors, pnum); + *file = NULL; + ret = bs->drv->bdrv_co_get_block_status(bs, sector_num, nb_sectors, pnum, + file); if (ret < 0) { *pnum = 0; + *file = NULL; return ret; } if (ret & BDRV_BLOCK_RAW) { assert(ret & BDRV_BLOCK_OFFSET_VALID); return bdrv_get_block_status(bs->file->bs, ret >> BDRV_SECTOR_BITS, - *pnum, pnum); + *pnum, pnum, file); } if (ret & (BDRV_BLOCK_DATA | BDRV_BLOCK_ZERO)) { @@ -1544,13 +1550,14 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, } } - if (bs->file && + if (bs->file && *file && *file != bs && (ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) && (ret & BDRV_BLOCK_OFFSET_VALID)) { + BlockDriverState *file2; int file_pnum; - ret2 = bdrv_co_get_block_status(bs->file->bs, ret >> BDRV_SECTOR_BITS, - *pnum, &file_pnum); + ret2 = bdrv_co_get_block_status(*file, ret >> BDRV_SECTOR_BITS, + *pnum, &file_pnum, &file2); if (ret2 >= 0) { /* Ignore errors. This is just providing extra information, it * is useful but not necessary. @@ -1575,14 +1582,15 @@ static int64_t coroutine_fn bdrv_co_get_block_status_above(BlockDriverState *bs, BlockDriverState *base, int64_t sector_num, int nb_sectors, - int *pnum) + int *pnum, + BlockDriverState **file) { BlockDriverState *p; int64_t ret = 0; assert(bs != base); for (p = bs; p != base; p = backing_bs(p)) { - ret = bdrv_co_get_block_status(p, sector_num, nb_sectors, pnum); + ret = bdrv_co_get_block_status(p, sector_num, nb_sectors, pnum, file); if (ret < 0 || ret & BDRV_BLOCK_ALLOCATED) { break; } @@ -1601,7 +1609,8 @@ static void coroutine_fn bdrv_get_block_status_above_co_entry(void *opaque) data->ret = bdrv_co_get_block_status_above(data->bs, data->base, data->sector_num, data->nb_sectors, - data->pnum); + data->pnum, + data->file); data->done = true; } @@ -1613,12 +1622,14 @@ static void coroutine_fn bdrv_get_block_status_above_co_entry(void *opaque) int64_t bdrv_get_block_status_above(BlockDriverState *bs, BlockDriverState *base, int64_t sector_num, - int nb_sectors, int *pnum) + int nb_sectors, int *pnum, + BlockDriverState **file) { Coroutine *co; BdrvCoGetBlockStatusData data = { .bs = bs, .base = base, + .file = file, .sector_num = sector_num, .nb_sectors = nb_sectors, .pnum = pnum, @@ -1642,16 +1653,19 @@ int64_t bdrv_get_block_status_above(BlockDriverState *bs, int64_t bdrv_get_block_status(BlockDriverState *bs, int64_t sector_num, - int nb_sectors, int *pnum) + int nb_sectors, int *pnum, + BlockDriverState **file) { return bdrv_get_block_status_above(bs, backing_bs(bs), - sector_num, nb_sectors, pnum); + sector_num, nb_sectors, pnum, file); } int coroutine_fn bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors, int *pnum) { - int64_t ret = bdrv_get_block_status(bs, sector_num, nb_sectors, pnum); + BlockDriverState *file; + int64_t ret = bdrv_get_block_status(bs, sector_num, nb_sectors, pnum, + &file); if (ret < 0) { return ret; } diff --git a/block/iscsi.c b/block/iscsi.c index bd1f1bf..2d1e230 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -532,7 +532,8 @@ static bool iscsi_allocationmap_is_allocated(IscsiLun *iscsilun, static int64_t coroutine_fn iscsi_co_get_block_status(BlockDriverState *bs, int64_t sector_num, - int nb_sectors, int *pnum) + int nb_sectors, int *pnum, + BlockDriverState **file) { IscsiLun *iscsilun = bs->opaque; struct scsi_get_lba_status *lbas = NULL; @@ -650,7 +651,8 @@ static int coroutine_fn iscsi_co_readv(BlockDriverState *bs, !iscsi_allocationmap_is_allocated(iscsilun, sector_num, nb_sectors)) { int64_t ret; int pnum; - ret = iscsi_co_get_block_status(bs, sector_num, INT_MAX, &pnum); + BlockDriverState *file; + ret = iscsi_co_get_block_status(bs, sector_num, INT_MAX, &pnum, &file); if (ret < 0) { return ret; } diff --git a/block/mirror.c b/block/mirror.c index f201f2b..e80a913 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -167,6 +167,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s) MirrorOp *op; int pnum; int64_t ret; + BlockDriverState *file; max_iov = MIN(source->bl.max_iov, s->target->bl.max_iov); @@ -305,7 +306,7 @@ static uint64_t coroutine_fn mirror_iteration(MirrorBlockJob *s) trace_mirror_one_iteration(s, sector_num, nb_sectors); ret = bdrv_get_block_status_above(source, NULL, sector_num, - nb_sectors, &pnum); + nb_sectors, &pnum, &file); if (ret < 0 || pnum < nb_sectors || (ret & BDRV_BLOCK_DATA && !(ret & BDRV_BLOCK_ZERO))) { bdrv_aio_readv(source, sector_num, &op->qiov, nb_sectors, diff --git a/block/parallels.c b/block/parallels.c index e4a56a5..d83246b 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -260,7 +260,7 @@ static coroutine_fn int parallels_co_flush_to_os(BlockDriverState *bs) static int64_t coroutine_fn parallels_co_get_block_status(BlockDriverState *bs, - int64_t sector_num, int nb_sectors, int *pnum) + int64_t sector_num, int nb_sectors, int *pnum, BlockDriverState **file) { BDRVParallelsState *s = bs->opaque; int64_t offset; diff --git a/block/qcow.c b/block/qcow.c index 635085e..558f443 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -488,7 +488,7 @@ static uint64_t get_cluster_offset(BlockDriverState *bs, } static int64_t coroutine_fn qcow_co_get_block_status(BlockDriverState *bs, - int64_t sector_num, int nb_sectors, int *pnum) + int64_t sector_num, int nb_sectors, int *pnum, BlockDriverState **file) { BDRVQcowState *s = bs->opaque; int index_in_cluster, n; diff --git a/block/qcow2.c b/block/qcow2.c index 1789af4..7096a29 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1329,7 +1329,7 @@ static void qcow2_join_options(QDict *options, QDict *old_options) } static int64_t coroutine_fn qcow2_co_get_block_status(BlockDriverState *bs, - int64_t sector_num, int nb_sectors, int *pnum) + int64_t sector_num, int nb_sectors, int *pnum, BlockDriverState **file) { BDRVQcow2State *s = bs->opaque; uint64_t cluster_offset; diff --git a/block/qed.c b/block/qed.c index 9b88895..a6bbd8b 100644 --- a/block/qed.c +++ b/block/qed.c @@ -724,7 +724,8 @@ static void qed_is_allocated_cb(void *opaque, int ret, uint64_t offset, size_t l static int64_t coroutine_fn bdrv_qed_co_get_block_status(BlockDriverState *bs, int64_t sector_num, - int nb_sectors, int *pnum) + int nb_sectors, int *pnum, + BlockDriverState **file) { BDRVQEDState *s = bs->opaque; size_t len = (size_t)nb_sectors * BDRV_SECTOR_SIZE; diff --git a/block/raw-posix.c b/block/raw-posix.c index 076d070..6fc0b71 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -1826,7 +1826,8 @@ static int find_allocation(BlockDriverState *bs, off_t start, */ static int64_t coroutine_fn raw_co_get_block_status(BlockDriverState *bs, int64_t sector_num, - int nb_sectors, int *pnum) + int nb_sectors, int *pnum, + BlockDriverState **file) { off_t start, data = 0, hole = 0; int64_t total_size; diff --git a/block/raw_bsd.c b/block/raw_bsd.c index 915d6fd..7d23c08 100644 --- a/block/raw_bsd.c +++ b/block/raw_bsd.c @@ -114,7 +114,8 @@ fail: static int64_t coroutine_fn raw_co_get_block_status(BlockDriverState *bs, int64_t sector_num, - int nb_sectors, int *pnum) + int nb_sectors, int *pnum, + BlockDriverState **file) { *pnum = nb_sectors; return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA | diff --git a/block/sheepdog.c b/block/sheepdog.c index d80e4ed..0f6789e 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -2709,7 +2709,7 @@ retry: static coroutine_fn int64_t sd_co_get_block_status(BlockDriverState *bs, int64_t sector_num, int nb_sectors, - int *pnum) + int *pnum, BlockDriverState **file) { BDRVSheepdogState *s = bs->opaque; SheepdogInode *inode = &s->inode; diff --git a/block/vdi.c b/block/vdi.c index 17f435f..2199fd3 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -526,7 +526,7 @@ static int vdi_reopen_prepare(BDRVReopenState *state, } static int64_t coroutine_fn vdi_co_get_block_status(BlockDriverState *bs, - int64_t sector_num, int nb_sectors, int *pnum) + int64_t sector_num, int nb_sectors, int *pnum, BlockDriverState **file) { /* TODO: Check for too large sector_num (in bdrv_is_allocated or here). */ BDRVVdiState *s = (BDRVVdiState *)bs->opaque; diff --git a/block/vmdk.c b/block/vmdk.c index 6f819e4..f5a56fd 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1248,7 +1248,7 @@ static inline uint64_t vmdk_find_index_in_cluster(VmdkExtent *extent, } static int64_t coroutine_fn vmdk_co_get_block_status(BlockDriverState *bs, - int64_t sector_num, int nb_sectors, int *pnum) + int64_t sector_num, int nb_sectors, int *pnum, BlockDriverState **file) { BDRVVmdkState *s = bs->opaque; int64_t index_in_cluster, n, ret; diff --git a/block/vpc.c b/block/vpc.c index 299d373..912f5d0 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -578,7 +578,7 @@ static coroutine_fn int vpc_co_write(BlockDriverState *bs, int64_t sector_num, } static int64_t coroutine_fn vpc_co_get_block_status(BlockDriverState *bs, - int64_t sector_num, int nb_sectors, int *pnum) + int64_t sector_num, int nb_sectors, int *pnum, BlockDriverState **file) { BDRVVPCState *s = bs->opaque; VHDFooter *footer = (VHDFooter*) s->footer_buf; diff --git a/block/vvfat.c b/block/vvfat.c index b184eca..b6b410a 100644 --- a/block/vvfat.c +++ b/block/vvfat.c @@ -2884,7 +2884,7 @@ static coroutine_fn int vvfat_co_write(BlockDriverState *bs, int64_t sector_num, } static int64_t coroutine_fn vvfat_co_get_block_status(BlockDriverState *bs, - int64_t sector_num, int nb_sectors, int* n) + int64_t sector_num, int nb_sectors, int *n, BlockDriverState **file) { BDRVVVFATState* s = bs->opaque; *n = s->sector_count - sector_num; diff --git a/include/block/block.h b/include/block/block.h index db8e096..ab966ad 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -113,7 +113,8 @@ typedef struct HDGeometry { * Allocation status flags * BDRV_BLOCK_DATA: data is read from bs->file or another file * BDRV_BLOCK_ZERO: sectors read as zero - * BDRV_BLOCK_OFFSET_VALID: sector stored in bs->file as raw data + * BDRV_BLOCK_OFFSET_VALID: sector stored in bs->file or another file + * as raw data * BDRV_BLOCK_ALLOCATED: the content of the block is determined by this * layer (as opposed to the backing file) * BDRV_BLOCK_RAW: used internally to indicate that the request @@ -384,11 +385,13 @@ int bdrv_has_zero_init(BlockDriverState *bs); bool bdrv_unallocated_blocks_are_zero(BlockDriverState *bs); bool bdrv_can_write_zeroes_with_unmap(BlockDriverState *bs); int64_t bdrv_get_block_status(BlockDriverState *bs, int64_t sector_num, - int nb_sectors, int *pnum); + int nb_sectors, int *pnum, + BlockDriverState **file); int64_t bdrv_get_block_status_above(BlockDriverState *bs, BlockDriverState *base, int64_t sector_num, - int nb_sectors, int *pnum); + int nb_sectors, int *pnum, + BlockDriverState **file); int bdrv_is_allocated(BlockDriverState *bs, int64_t sector_num, int nb_sectors, int *pnum); int bdrv_is_allocated_above(BlockDriverState *top, BlockDriverState *base, diff --git a/include/block/block_int.h b/include/block/block_int.h index 256609d..fcd32eb 100644 --- a/include/block/block_int.h +++ b/include/block/block_int.h @@ -166,7 +166,8 @@ struct BlockDriver { int coroutine_fn (*bdrv_co_discard)(BlockDriverState *bs, int64_t sector_num, int nb_sectors); int64_t coroutine_fn (*bdrv_co_get_block_status)(BlockDriverState *bs, - int64_t sector_num, int nb_sectors, int *pnum); + int64_t sector_num, int nb_sectors, int *pnum, + BlockDriverState **file); /* * Invalidate any cached meta-data. diff --git a/qemu-img.c b/qemu-img.c index 3d48b4f..ac4eee5 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -1259,9 +1259,10 @@ static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num) n = MIN(s->total_sectors - sector_num, BDRV_REQUEST_MAX_SECTORS); if (s->sector_next_status <= sector_num) { + BlockDriverState *file; ret = bdrv_get_block_status(blk_bs(s->src[s->src_cur]), sector_num - s->src_cur_offset, - n, &n); + n, &n, &file); if (ret < 0) { return ret; } @@ -2192,6 +2193,7 @@ static int get_block_status(BlockDriverState *bs, int64_t sector_num, { int64_t ret; int depth; + BlockDriverState *file; /* As an optimization, we could cache the current range of unallocated * clusters in each file of the chain, and avoid querying the same @@ -2200,7 +2202,8 @@ static int get_block_status(BlockDriverState *bs, int64_t sector_num, depth = 0; for (;;) { - ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &nb_sectors); + ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &nb_sectors, + &file); if (ret < 0) { return ret; } -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH v5 01/15] block: Add "file" output parameter to block status query functions 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 01/15] block: Add "file" output parameter to block status query functions Fam Zheng @ 2016-01-06 16:43 ` Max Reitz 0 siblings, 0 replies; 19+ messages in thread From: Max Reitz @ 2016-01-06 16:43 UTC (permalink / raw) To: Fam Zheng, qemu-devel; +Cc: Kevin Wolf, pbonzini, Stefan Hajnoczi, qemu-block [-- Attachment #1: Type: text/plain, Size: 6182 bytes --] On 05.01.2016 09:11, Fam Zheng wrote: > The added parameter can be used to return the BDS pointer which the > valid offset is referring to. Its value should be ignored unless > BDRV_BLOCK_OFFSET_VALID in ret is set. > > Until block drivers fill in the right value, let's clear it explicitly > right before calling .bdrv_get_block_status. > > The "bs->file" condition in bdrv_co_get_block_status is kept now to keep iotest > case 102 passing, and will be fixed once all drivers return the right file > pointer. > > Signed-off-by: Fam Zheng <famz@redhat.com> > --- > block/io.c | 42 ++++++++++++++++++++++++++++-------------- > block/iscsi.c | 6 ++++-- > block/mirror.c | 3 ++- > block/parallels.c | 2 +- > block/qcow.c | 2 +- > block/qcow2.c | 2 +- > block/qed.c | 3 ++- > block/raw-posix.c | 3 ++- > block/raw_bsd.c | 3 ++- > block/sheepdog.c | 2 +- > block/vdi.c | 2 +- > block/vmdk.c | 2 +- > block/vpc.c | 2 +- > block/vvfat.c | 2 +- > include/block/block.h | 9 ++++++--- > include/block/block_int.h | 3 ++- > qemu-img.c | 7 +++++-- > 17 files changed, 61 insertions(+), 34 deletions(-) > > diff --git a/block/io.c b/block/io.c > index 63e3678..492c291 100644 > --- a/block/io.c > +++ b/block/io.c > @@ -663,6 +663,7 @@ int bdrv_write_zeroes(BlockDriverState *bs, int64_t sector_num, > int bdrv_make_zero(BlockDriverState *bs, BdrvRequestFlags flags) > { > int64_t target_sectors, ret, nb_sectors, sector_num = 0; > + BlockDriverState *file; > int n; > > target_sectors = bdrv_nb_sectors(bs); > @@ -675,7 +676,7 @@ int bdrv_make_zero(BlockDriverState *bs, BdrvRequestFlags flags) > if (nb_sectors <= 0) { > return 0; > } > - ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &n); > + ret = bdrv_get_block_status(bs, sector_num, nb_sectors, &n, &file); > if (ret < 0) { > error_report("error getting block status at sector %" PRId64 ": %s", > sector_num, strerror(-ret)); > @@ -1464,6 +1465,7 @@ int bdrv_flush_all(void) > typedef struct BdrvCoGetBlockStatusData { > BlockDriverState *bs; > BlockDriverState *base; > + BlockDriverState **file; > int64_t sector_num; > int nb_sectors; > int *pnum; > @@ -1488,7 +1490,8 @@ typedef struct BdrvCoGetBlockStatusData { > */ > static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, > int64_t sector_num, > - int nb_sectors, int *pnum) > + int nb_sectors, int *pnum, > + BlockDriverState **file) > { > int64_t total_sectors; > int64_t n; > @@ -1518,16 +1521,19 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, > return ret; > } > > - ret = bs->drv->bdrv_co_get_block_status(bs, sector_num, nb_sectors, pnum); > + *file = NULL; > + ret = bs->drv->bdrv_co_get_block_status(bs, sector_num, nb_sectors, pnum, > + file); > if (ret < 0) { > *pnum = 0; > + *file = NULL; > return ret; > } > > if (ret & BDRV_BLOCK_RAW) { > assert(ret & BDRV_BLOCK_OFFSET_VALID); > return bdrv_get_block_status(bs->file->bs, ret >> BDRV_SECTOR_BITS, > - *pnum, pnum); > + *pnum, pnum, file); > } > > if (ret & (BDRV_BLOCK_DATA | BDRV_BLOCK_ZERO)) { > @@ -1544,13 +1550,14 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, > } > } > > - if (bs->file && > + if (bs->file && *file && *file != bs && In order to keep iotest 102 working, this line should not be changed at all in this patch. Because *file is NULL and not changed by any of the block drivers, the condition will always be false now (breaking iotest 102). > (ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) && > (ret & BDRV_BLOCK_OFFSET_VALID)) { > + BlockDriverState *file2; > int file_pnum; > > - ret2 = bdrv_co_get_block_status(bs->file->bs, ret >> BDRV_SECTOR_BITS, > - *pnum, &file_pnum); > + ret2 = bdrv_co_get_block_status(*file, ret >> BDRV_SECTOR_BITS, And instead of *file, this should remain bs->file->bs. > + *pnum, &file_pnum, &file2); > if (ret2 >= 0) { > /* Ignore errors. This is just providing extra information, it > * is useful but not necessary. [...] > diff --git a/include/block/block.h b/include/block/block.h > index db8e096..ab966ad 100644 > --- a/include/block/block.h > +++ b/include/block/block.h > @@ -113,7 +113,8 @@ typedef struct HDGeometry { > * Allocation status flags > * BDRV_BLOCK_DATA: data is read from bs->file or another file > * BDRV_BLOCK_ZERO: sectors read as zero > - * BDRV_BLOCK_OFFSET_VALID: sector stored in bs->file as raw data > + * BDRV_BLOCK_OFFSET_VALID: sector stored in bs->file or another file > + * as raw data Hm, this seems so unspecific. We do know exactly where the data is stored, and that is in the *file BDS returned by bdrv_get_block_status(). Can we make some reference to that? I don't know whether "sector stored in *file as raw data" will be clear enough, though. Maybe "sector stored in the BDS returned as *file by bdrv_get_block_status()" will suffice. Max > * BDRV_BLOCK_ALLOCATED: the content of the block is determined by this > * layer (as opposed to the backing file) > * BDRV_BLOCK_RAW: used internally to indicate that the request [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 02/15] qcow: Assign bs->file->bs to file in qcow_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 01/15] block: Add "file" output parameter to block status query functions Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 03/15] qcow2: Assign bs->file->bs to file in qcow2_co_get_block_status Fam Zheng ` (12 subsequent siblings) 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/qcow.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/qcow.c b/block/qcow.c index 558f443..b59383f 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -509,6 +509,7 @@ static int64_t coroutine_fn qcow_co_get_block_status(BlockDriverState *bs, return BDRV_BLOCK_DATA; } cluster_offset |= (index_in_cluster << BDRV_SECTOR_BITS); + *file = bs->file->bs; return BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID | cluster_offset; } -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 03/15] qcow2: Assign bs->file->bs to file in qcow2_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 01/15] block: Add "file" output parameter to block status query functions Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 02/15] qcow: Assign bs->file->bs to file in qcow_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 04/15] raw: Assign bs to file in raw_co_get_block_status Fam Zheng ` (11 subsequent siblings) 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/qcow2.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/qcow2.c b/block/qcow2.c index 7096a29..da74eb7 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1348,6 +1348,7 @@ static int64_t coroutine_fn qcow2_co_get_block_status(BlockDriverState *bs, !s->cipher) { index_in_cluster = sector_num & (s->cluster_sectors - 1); cluster_offset |= (index_in_cluster << BDRV_SECTOR_BITS); + *file = bs->file->bs; status |= BDRV_BLOCK_OFFSET_VALID | cluster_offset; } if (ret == QCOW2_CLUSTER_ZERO) { -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 04/15] raw: Assign bs to file in raw_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (2 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 03/15] qcow2: Assign bs->file->bs to file in qcow2_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 05/15] iscsi: Assign bs to file in iscsi_co_get_block_status Fam Zheng ` (10 subsequent siblings) 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/raw-posix.c | 1 + block/raw_bsd.c | 1 + 2 files changed, 2 insertions(+) diff --git a/block/raw-posix.c b/block/raw-posix.c index 6fc0b71..344272f 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -1869,6 +1869,7 @@ static int64_t coroutine_fn raw_co_get_block_status(BlockDriverState *bs, *pnum = MIN(nb_sectors, (data - start) / BDRV_SECTOR_SIZE); ret = BDRV_BLOCK_ZERO; } + *file = bs; return ret | BDRV_BLOCK_OFFSET_VALID | start; } diff --git a/block/raw_bsd.c b/block/raw_bsd.c index 7d23c08..2d4c896 100644 --- a/block/raw_bsd.c +++ b/block/raw_bsd.c @@ -118,6 +118,7 @@ static int64_t coroutine_fn raw_co_get_block_status(BlockDriverState *bs, BlockDriverState **file) { *pnum = nb_sectors; + *file = bs; return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA | (sector_num << BDRV_SECTOR_BITS); } -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 05/15] iscsi: Assign bs to file in iscsi_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (3 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 04/15] raw: Assign bs to file in raw_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 06/15] parallels: Assign bs->file->bs to file in parallels_co_get_block_status Fam Zheng ` (9 subsequent siblings) 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/iscsi.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/block/iscsi.c b/block/iscsi.c index 2d1e230..8c7f1b3 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -625,6 +625,9 @@ out: if (iTask.task != NULL) { scsi_free_scsi_task(iTask.task); } + if (ret > 0 && ret & BDRV_BLOCK_OFFSET_VALID) { + *file = bs; + } return ret; } -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 06/15] parallels: Assign bs->file->bs to file in parallels_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (4 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 05/15] iscsi: Assign bs to file in iscsi_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 07/15] qed: Assign bs->file->bs to file in bdrv_qed_co_get_block_status Fam Zheng ` (8 subsequent siblings) 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/parallels.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/parallels.c b/block/parallels.c index d83246b..129668b 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -273,6 +273,7 @@ static int64_t coroutine_fn parallels_co_get_block_status(BlockDriverState *bs, return 0; } + *file = bs->file->bs; return (offset << BDRV_SECTOR_BITS) | BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID; } -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 07/15] qed: Assign bs->file->bs to file in bdrv_qed_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (5 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 06/15] parallels: Assign bs->file->bs to file in parallels_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 08/15] sheepdog: Assign bs to file in sd_co_get_block_status Fam Zheng ` (7 subsequent siblings) 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/qed.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/block/qed.c b/block/qed.c index a6bbd8b..03af9c1 100644 --- a/block/qed.c +++ b/block/qed.c @@ -692,6 +692,7 @@ typedef struct { uint64_t pos; int64_t status; int *pnum; + BlockDriverState **file; } QEDIsAllocatedCB; static void qed_is_allocated_cb(void *opaque, int ret, uint64_t offset, size_t len) @@ -703,6 +704,7 @@ static void qed_is_allocated_cb(void *opaque, int ret, uint64_t offset, size_t l case QED_CLUSTER_FOUND: offset |= qed_offset_into_cluster(s, cb->pos); cb->status = BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID | offset; + *cb->file = cb->bs->file->bs; break; case QED_CLUSTER_ZERO: cb->status = BDRV_BLOCK_ZERO; @@ -734,6 +736,7 @@ static int64_t coroutine_fn bdrv_qed_co_get_block_status(BlockDriverState *bs, .pos = (uint64_t)sector_num * BDRV_SECTOR_SIZE, .status = BDRV_BLOCK_OFFSET_MASK, .pnum = pnum, + .file = file, }; QEDRequest request = { .l2_table = NULL }; -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 08/15] sheepdog: Assign bs to file in sd_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (6 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 07/15] qed: Assign bs->file->bs to file in bdrv_qed_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 09/15] vdi: Assign bs->file->bs to file in vdi_co_get_block_status Fam Zheng ` (6 subsequent siblings) 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/sheepdog.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/block/sheepdog.c b/block/sheepdog.c index 0f6789e..d5e7ff8 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -2740,6 +2740,9 @@ sd_co_get_block_status(BlockDriverState *bs, int64_t sector_num, int nb_sectors, if (*pnum > nb_sectors) { *pnum = nb_sectors; } + if (ret > 0 && ret & BDRV_BLOCK_OFFSET_VALID) { + *file = bs; + } return ret; } -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 09/15] vdi: Assign bs->file->bs to file in vdi_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (7 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 08/15] sheepdog: Assign bs to file in sd_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 10/15] vpc: Assign bs->file->bs to file in vpc_co_get_block_status Fam Zheng ` (5 subsequent siblings) 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/vdi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/vdi.c b/block/vdi.c index 2199fd3..6b1a57b 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -550,6 +550,7 @@ static int64_t coroutine_fn vdi_co_get_block_status(BlockDriverState *bs, offset = s->header.offset_data + (uint64_t)bmap_entry * s->block_size + sector_in_block * SECTOR_SIZE; + *file = bs->file->bs; return BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID | offset; } -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 10/15] vpc: Assign bs->file->bs to file in vpc_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (8 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 09/15] vdi: Assign bs->file->bs to file in vdi_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 11/15] vmdk: Return extent's file in bdrv_get_block_status Fam Zheng ` (4 subsequent siblings) 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- block/vpc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/block/vpc.c b/block/vpc.c index 912f5d0..412ff41 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -588,6 +588,7 @@ static int64_t coroutine_fn vpc_co_get_block_status(BlockDriverState *bs, if (be32_to_cpu(footer->type) == VHD_FIXED) { *pnum = nb_sectors; + *file = bs->file->bs; return BDRV_BLOCK_RAW | BDRV_BLOCK_OFFSET_VALID | BDRV_BLOCK_DATA | (sector_num << BDRV_SECTOR_BITS); } @@ -609,6 +610,7 @@ static int64_t coroutine_fn vpc_co_get_block_status(BlockDriverState *bs, /* *pnum can't be greater than one block for allocated * sectors since there is always a bitmap in between. */ if (allocated) { + *file = bs->file->bs; return BDRV_BLOCK_DATA | BDRV_BLOCK_OFFSET_VALID | start; } if (nb_sectors == 0) { -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 11/15] vmdk: Return extent's file in bdrv_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (9 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 10/15] vpc: Assign bs->file->bs to file in vpc_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-06 16:50 ` Max Reitz 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 12/15] block: Remove the "bs->file" test in bdrv_co_get_block_status Fam Zheng ` (3 subsequent siblings) 14 siblings, 1 reply; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Signed-off-by: Fam Zheng <famz@redhat.com> --- block/vmdk.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index f5a56fd..59e1ffe 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1265,6 +1265,7 @@ static int64_t coroutine_fn vmdk_co_get_block_status(BlockDriverState *bs, 0, 0); qemu_co_mutex_unlock(&s->lock); + index_in_cluster = vmdk_find_index_in_cluster(extent, sector_num); switch (ret) { case VMDK_ERROR: ret = -EIO; @@ -1277,14 +1278,15 @@ static int64_t coroutine_fn vmdk_co_get_block_status(BlockDriverState *bs, break; case VMDK_OK: ret = BDRV_BLOCK_DATA; - if (extent->file == bs->file && !extent->compressed) { - ret |= BDRV_BLOCK_OFFSET_VALID | offset; + if (!extent->compressed) { + ret |= BDRV_BLOCK_OFFSET_VALID; + ret |= (offset + (index_in_cluster << BDRV_SECTOR_BITS)) + & BDRV_BLOCK_OFFSET_MASK; } - + *file = extent->file->bs; break; } - index_in_cluster = vmdk_find_index_in_cluster(extent, sector_num); n = extent->cluster_sectors - index_in_cluster; if (n > nb_sectors) { n = nb_sectors; -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH v5 11/15] vmdk: Return extent's file in bdrv_get_block_status 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 11/15] vmdk: Return extent's file in bdrv_get_block_status Fam Zheng @ 2016-01-06 16:50 ` Max Reitz 0 siblings, 0 replies; 19+ messages in thread From: Max Reitz @ 2016-01-06 16:50 UTC (permalink / raw) To: Fam Zheng, qemu-devel; +Cc: Kevin Wolf, pbonzini, Stefan Hajnoczi, qemu-block [-- Attachment #1: Type: text/plain, Size: 225 bytes --] On 05.01.2016 09:11, Fam Zheng wrote: > Signed-off-by: Fam Zheng <famz@redhat.com> > --- > block/vmdk.c | 10 ++++++---- > 1 file changed, 6 insertions(+), 4 deletions(-) Reviewed-by: Max Reitz <mreitz@redhat.com> [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 12/15] block: Remove the "bs->file" test in bdrv_co_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (10 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 11/15] vmdk: Return extent's file in bdrv_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-06 16:52 ` Max Reitz 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 13/15] qemu-img: In "map", use the returned "file" from bdrv_get_block_status Fam Zheng ` (2 subsequent siblings) 14 siblings, 1 reply; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Now that all drivers return the right "file" pointer, we can remove this check. Signed-off-by: Fam Zheng <famz@redhat.com> --- block/io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/block/io.c b/block/io.c index 492c291..1ca4e61 100644 --- a/block/io.c +++ b/block/io.c @@ -1550,7 +1550,7 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, } } - if (bs->file && *file && *file != bs && + if (*file && *file != bs && (ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) && (ret & BDRV_BLOCK_OFFSET_VALID)) { BlockDriverState *file2; -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [Qemu-devel] [PATCH v5 12/15] block: Remove the "bs->file" test in bdrv_co_get_block_status 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 12/15] block: Remove the "bs->file" test in bdrv_co_get_block_status Fam Zheng @ 2016-01-06 16:52 ` Max Reitz 0 siblings, 0 replies; 19+ messages in thread From: Max Reitz @ 2016-01-06 16:52 UTC (permalink / raw) To: Fam Zheng, qemu-devel; +Cc: Kevin Wolf, pbonzini, Stefan Hajnoczi, qemu-block [-- Attachment #1: Type: text/plain, Size: 1027 bytes --] On 05.01.2016 09:11, Fam Zheng wrote: > Now that all drivers return the right "file" pointer, we can remove this > check. > > Signed-off-by: Fam Zheng <famz@redhat.com> > --- > block/io.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/block/io.c b/block/io.c > index 492c291..1ca4e61 100644 > --- a/block/io.c > +++ b/block/io.c > @@ -1550,7 +1550,7 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, > } > } > > - if (bs->file && *file && *file != bs && > + if (*file && *file != bs && > (ret & BDRV_BLOCK_DATA) && !(ret & BDRV_BLOCK_ZERO) && > (ret & BDRV_BLOCK_OFFSET_VALID)) { > BlockDriverState *file2; Fine by itself, but I think patch 1 needs a change, so this should be - if (bs->file && + if (*file && *file != bs && instead; and the first parameter of the subsequent bdrv_co_get_block_status() call then needs to be changed to *file here (instead of in patch 1). Max [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 13/15] qemu-img: In "map", use the returned "file" from bdrv_get_block_status 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (11 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 12/15] block: Remove the "bs->file" test in bdrv_co_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 14/15] qemu-img: Make MapEntry a QAPI struct Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 15/15] iotests: Add "qemu-img map" test for VMDK extents Fam Zheng 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Now all drivers should return a correct "file", we can make use of it, even with the recursion into backing chain above. Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- qemu-img.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qemu-img.c b/qemu-img.c index ac4eee5..a35edee 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -2225,7 +2225,7 @@ static int get_block_status(BlockDriverState *bs, int64_t sector_num, e->flags = ret & ~BDRV_BLOCK_OFFSET_MASK; e->offset = ret & BDRV_BLOCK_OFFSET_MASK; e->depth = depth; - e->bs = bs; + e->bs = file; return 0; } -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 14/15] qemu-img: Make MapEntry a QAPI struct 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (12 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 13/15] qemu-img: In "map", use the returned "file" from bdrv_get_block_status Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 15/15] iotests: Add "qemu-img map" test for VMDK extents Fam Zheng 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini The "flags" bit mask is expanded to two booleans, "data" and "zero"; "bs" is replaced with "filename" string. Refactor the merge conditions in img_map() into entry_mergeable(). Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- qapi/block-core.json | 27 ++++++++++++++++++++ qemu-img.c | 71 +++++++++++++++++++++++++++++++--------------------- 2 files changed, 69 insertions(+), 29 deletions(-) diff --git a/qapi/block-core.json b/qapi/block-core.json index 1a5d9ce..90f7467 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -186,6 +186,33 @@ '*fragmented-clusters': 'int', '*compressed-clusters': 'int' } } ## +# @MapEntry: +# +# Mapping information from a virtual block range to a host file range +# +# @start: the start byte of the mapped virtual range +# +# @length: the number of bytes of the mapped virtual range +# +# @data: whether the mapped range has data +# +# @zero: whether the virtual blocks are zeroed +# +# @depth: the depth of the mapping +# +# @offset: #optional the offset in file that the virtual sectors are mapped to +# +# @filename: #optional filename that is referred to by @offset +# +# Since: 2.6 +# +## +{ 'struct': 'MapEntry', + 'data': {'start': 'int', 'length': 'int', 'data': 'bool', + 'zero': 'bool', 'depth': 'int', '*offset': 'int', + '*filename': 'str' } } + +## # @BlockdevCacheInfo # # Cache mode information for a block device diff --git a/qemu-img.c b/qemu-img.c index a35edee..78b755c 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -2136,47 +2136,37 @@ static int img_info(int argc, char **argv) return 0; } - -typedef struct MapEntry { - int flags; - int depth; - int64_t start; - int64_t length; - int64_t offset; - BlockDriverState *bs; -} MapEntry; - static void dump_map_entry(OutputFormat output_format, MapEntry *e, MapEntry *next) { switch (output_format) { case OFORMAT_HUMAN: - if ((e->flags & BDRV_BLOCK_DATA) && - !(e->flags & BDRV_BLOCK_OFFSET_VALID)) { + if (e->data && !e->has_offset) { error_report("File contains external, encrypted or compressed clusters."); exit(1); } - if ((e->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) == BDRV_BLOCK_DATA) { + if (e->data && !e->zero) { printf("%#-16"PRIx64"%#-16"PRIx64"%#-16"PRIx64"%s\n", - e->start, e->length, e->offset, e->bs->filename); + e->start, e->length, + e->has_offset ? e->offset : 0, + e->has_filename ? e->filename : ""); } /* This format ignores the distinction between 0, ZERO and ZERO|DATA. * Modify the flags here to allow more coalescing. */ - if (next && - (next->flags & (BDRV_BLOCK_DATA|BDRV_BLOCK_ZERO)) != BDRV_BLOCK_DATA) { - next->flags &= ~BDRV_BLOCK_DATA; - next->flags |= BDRV_BLOCK_ZERO; + if (next && (!next->data || next->zero)) { + next->data = false; + next->zero = true; } break; case OFORMAT_JSON: - printf("%s{ \"start\": %"PRId64", \"length\": %"PRId64", \"depth\": %d," - " \"zero\": %s, \"data\": %s", + printf("%s{ \"start\": %"PRId64", \"length\": %"PRId64"," + " \"depth\": %"PRId64", \"zero\": %s, \"data\": %s", (e->start == 0 ? "[" : ",\n"), e->start, e->length, e->depth, - (e->flags & BDRV_BLOCK_ZERO) ? "true" : "false", - (e->flags & BDRV_BLOCK_DATA) ? "true" : "false"); - if (e->flags & BDRV_BLOCK_OFFSET_VALID) { + e->zero ? "true" : "false", + e->data ? "true" : "false"); + if (e->has_offset) { printf(", \"offset\": %"PRId64"", e->offset); } putchar('}'); @@ -2222,13 +2212,39 @@ static int get_block_status(BlockDriverState *bs, int64_t sector_num, e->start = sector_num * BDRV_SECTOR_SIZE; e->length = nb_sectors * BDRV_SECTOR_SIZE; - e->flags = ret & ~BDRV_BLOCK_OFFSET_MASK; + e->data = !!(ret & BDRV_BLOCK_DATA); + e->zero = !!(ret & BDRV_BLOCK_ZERO); e->offset = ret & BDRV_BLOCK_OFFSET_MASK; + e->has_offset = !!(ret & BDRV_BLOCK_OFFSET_VALID); e->depth = depth; - e->bs = file; + if (file && e->has_offset) { + e->has_filename = true; + e->filename = file->filename; + } return 0; } +static inline bool entry_mergeable(const MapEntry *curr, const MapEntry *next) +{ + if (curr->length == 0) { + return false; + } + if (curr->zero != next->zero || + curr->data != next->data || + curr->depth != next->depth || + curr->has_filename != next->has_filename || + curr->has_offset != next->has_offset) { + return false; + } + if (curr->has_filename && strcmp(curr->filename, next->filename)) { + return false; + } + if (curr->has_offset && curr->offset + curr->length != next->offset) { + return false; + } + return true; +} + static int img_map(int argc, char **argv) { int c; @@ -2310,10 +2326,7 @@ static int img_map(int argc, char **argv) goto out; } - if (curr.length != 0 && curr.flags == next.flags && - curr.depth == next.depth && - ((curr.flags & BDRV_BLOCK_OFFSET_VALID) == 0 || - curr.offset + curr.length == next.offset)) { + if (entry_mergeable(&curr, &next)) { curr.length += next.length; continue; } -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
* [Qemu-devel] [PATCH v5 15/15] iotests: Add "qemu-img map" test for VMDK extents 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (13 preceding siblings ...) 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 14/15] qemu-img: Make MapEntry a QAPI struct Fam Zheng @ 2016-01-05 8:11 ` Fam Zheng 14 siblings, 0 replies; 19+ messages in thread From: Fam Zheng @ 2016-01-05 8:11 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com> --- tests/qemu-iotests/059 | 10 ++++++++++ tests/qemu-iotests/059.out | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/tests/qemu-iotests/059 b/tests/qemu-iotests/059 index 0ded0c3..261d8b0 100755 --- a/tests/qemu-iotests/059 +++ b/tests/qemu-iotests/059 @@ -133,6 +133,16 @@ $QEMU_IO -c "write -P 0xa 900G 512" "$TEST_IMG" | _filter_qemu_io $QEMU_IO -c "read -v 900G 1024" "$TEST_IMG" | _filter_qemu_io echo +echo "=== Testing qemu-img map on extents ===" +for fmt in twoGbMaxExtentSparse twoGbMaxExtentFlat; do + IMGOPTS="subformat=$fmt" _make_test_img 31G + $QEMU_IO -c "write 65024 1k" "$TEST_IMG" | _filter_qemu_io + $QEMU_IO -c "write 2147483136 1k" "$TEST_IMG" | _filter_qemu_io + $QEMU_IO -c "write 5G 1k" "$TEST_IMG" | _filter_qemu_io + $QEMU_IMG map "$TEST_IMG" | _filter_testdir +done + +echo echo "=== Testing afl image with a very large capacity ===" _use_sample_img afl9.vmdk.bz2 _img_info diff --git a/tests/qemu-iotests/059.out b/tests/qemu-iotests/059.out index 00057fe..54eb530 100644 --- a/tests/qemu-iotests/059.out +++ b/tests/qemu-iotests/059.out @@ -2337,6 +2337,44 @@ e1000003f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ read 1024/1024 bytes at offset 966367641600 1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +=== Testing qemu-img map on extents === +Formatting 'TEST_DIR/iotest-version3.IMGFMT', fmt=IMGFMT size=33285996544 subformat=twoGbMaxExtentSparse +wrote 1024/1024 bytes at offset 65024 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 2147483136 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 5368709120 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Offset Length Mapped to File +0 0x20000 0x50000 TEST_DIR/iotest-version3-s001.vmdk +0x7fff0000 0x10000 0x70000 TEST_DIR/iotest-version3-s001.vmdk +0x80000000 0x10000 0x50000 TEST_DIR/iotest-version3-s002.vmdk +0x140000000 0x10000 0x50000 TEST_DIR/iotest-version3-s003.vmdk +Formatting 'TEST_DIR/iotest-version3.IMGFMT', fmt=IMGFMT size=33285996544 subformat=twoGbMaxExtentFlat +wrote 1024/1024 bytes at offset 65024 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 2147483136 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +wrote 1024/1024 bytes at offset 5368709120 +1 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) +Offset Length Mapped to File +0 0x80000000 0 TEST_DIR/iotest-version3-f001.vmdk +0x80000000 0x80000000 0 TEST_DIR/iotest-version3-f002.vmdk +0x100000000 0x80000000 0 TEST_DIR/iotest-version3-f003.vmdk +0x180000000 0x80000000 0 TEST_DIR/iotest-version3-f004.vmdk +0x200000000 0x80000000 0 TEST_DIR/iotest-version3-f005.vmdk +0x280000000 0x80000000 0 TEST_DIR/iotest-version3-f006.vmdk +0x300000000 0x80000000 0 TEST_DIR/iotest-version3-f007.vmdk +0x380000000 0x80000000 0 TEST_DIR/iotest-version3-f008.vmdk +0x400000000 0x80000000 0 TEST_DIR/iotest-version3-f009.vmdk +0x480000000 0x80000000 0 TEST_DIR/iotest-version3-f010.vmdk +0x500000000 0x80000000 0 TEST_DIR/iotest-version3-f011.vmdk +0x580000000 0x80000000 0 TEST_DIR/iotest-version3-f012.vmdk +0x600000000 0x80000000 0 TEST_DIR/iotest-version3-f013.vmdk +0x680000000 0x80000000 0 TEST_DIR/iotest-version3-f014.vmdk +0x700000000 0x80000000 0 TEST_DIR/iotest-version3-f015.vmdk +0x780000000 0x40000000 0 TEST_DIR/iotest-version3-f016.vmdk + === Testing afl image with a very large capacity === qemu-img: Can't get size of device 'image': File too large *** done -- 2.4.3 ^ permalink raw reply related [flat|nested] 19+ messages in thread
end of thread, other threads:[~2016-01-06 16:52 UTC | newest] Thread overview: 19+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-01-05 8:11 [Qemu-devel] [PATCH v5 00/15] qemu-img map: Allow driver to return file of the allocated block Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 01/15] block: Add "file" output parameter to block status query functions Fam Zheng 2016-01-06 16:43 ` Max Reitz 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 02/15] qcow: Assign bs->file->bs to file in qcow_co_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 03/15] qcow2: Assign bs->file->bs to file in qcow2_co_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 04/15] raw: Assign bs to file in raw_co_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 05/15] iscsi: Assign bs to file in iscsi_co_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 06/15] parallels: Assign bs->file->bs to file in parallels_co_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 07/15] qed: Assign bs->file->bs to file in bdrv_qed_co_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 08/15] sheepdog: Assign bs to file in sd_co_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 09/15] vdi: Assign bs->file->bs to file in vdi_co_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 10/15] vpc: Assign bs->file->bs to file in vpc_co_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 11/15] vmdk: Return extent's file in bdrv_get_block_status Fam Zheng 2016-01-06 16:50 ` Max Reitz 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 12/15] block: Remove the "bs->file" test in bdrv_co_get_block_status Fam Zheng 2016-01-06 16:52 ` Max Reitz 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 13/15] qemu-img: In "map", use the returned "file" from bdrv_get_block_status Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 14/15] qemu-img: Make MapEntry a QAPI struct Fam Zheng 2016-01-05 8:11 ` [Qemu-devel] [PATCH v5 15/15] iotests: Add "qemu-img map" test for VMDK extents Fam Zheng
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).