* [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block @ 2016-01-26 3:58 Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 01/16] block: Add "file" output parameter to block status query functions Fam Zheng ` (16 more replies) 0 siblings, 17 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini v9: 01: Add comment for the new parameter, and remove the superfluous reset of 'file'. [Kevin] 04: bs => bs->file->bs. [Kevin] 11: Split the bugfix. [Kevin] 15: Don't corrupt 059.out. [Max] v8: Fix patch 15. [Max] Add Max's rev-by in patch 1. v7: Rebase, update patch 1 for two new bdrv_get_block_status_above() callers in qemu-img.c. [Max] Add Max's rev-by in patch 12. 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 (16): 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: Fix calculation of block status's offset vmdk: Return extent's file in bdrv_get_block_status block: Use returned *file 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 | 44 ++++++++++++++++-------- 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 | 11 +++--- include/block/block_int.h | 3 +- qapi/block-core.json | 27 +++++++++++++++ qemu-img.c | 84 ++++++++++++++++++++++++++++------------------ tests/qemu-iotests/059 | 10 ++++++ tests/qemu-iotests/059.out | 25 ++++++++++++++ 20 files changed, 195 insertions(+), 70 deletions(-) -- 2.4.3 ^ permalink raw reply [flat|nested] 23+ messages in thread
* [Qemu-devel] [PATCH v9 01/16] block: Add "file" output parameter to block status query functions 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-27 18:14 ` Max Reitz 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 02/16] qcow: Assign bs->file->bs to file in qcow_co_get_block_status Fam Zheng ` (15 subsequent siblings) 16 siblings, 1 reply; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 | 40 ++++++++++++++++++++++++++++------------ 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 | 11 +++++++---- include/block/block_int.h | 3 ++- qemu-img.c | 13 +++++++++---- 17 files changed, 66 insertions(+), 35 deletions(-) diff --git a/block/io.c b/block/io.c index 5bb353a..ea040be 100644 --- a/block/io.c +++ b/block/io.c @@ -664,6 +664,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); @@ -676,7 +677,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)); @@ -1466,6 +1467,7 @@ int bdrv_flush_all(void) typedef struct BdrvCoGetBlockStatusData { BlockDriverState *bs; BlockDriverState *base; + BlockDriverState **file; int64_t sector_num; int nb_sectors; int *pnum; @@ -1487,10 +1489,14 @@ typedef struct BdrvCoGetBlockStatusData { * * 'nb_sectors' is the max value 'pnum' should be set to. If nb_sectors goes * beyond the end of the disk image it will be clamped. + * + * If returned value is positive and BDRV_BLOCK_OFFSET_VALID bit is set, 'file' + * points to the BDS which the sector range is allocated in. */ 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; @@ -1520,7 +1526,9 @@ 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; return ret; @@ -1529,7 +1537,7 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, 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)) { @@ -1549,10 +1557,11 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, if (bs->file && (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); + *pnum, &file_pnum, &file2); if (ret2 >= 0) { /* Ignore errors. This is just providing extra information, it * is useful but not necessary. @@ -1577,14 +1586,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; } @@ -1603,7 +1613,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; } @@ -1615,12 +1626,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, @@ -1644,16 +1657,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 bffd707..e182557 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 e9e151c..2c0edfa 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -168,6 +168,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); @@ -306,7 +307,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 ee39081..e2de308 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -261,7 +261,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 afed18f..4202797 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -489,7 +489,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 fd8436c..d4ea6b4 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1330,7 +1330,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 0c870cd..8f6f841 100644 --- a/block/qed.c +++ b/block/qed.c @@ -725,7 +725,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 6df3067..3ef9b25 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -1818,7 +1818,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 bcaee11..9a8933b 100644 --- a/block/raw_bsd.c +++ b/block/raw_bsd.c @@ -115,7 +115,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 ff89298..2ea05a6 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -2708,7 +2708,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 61bcd54..294c438 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -527,7 +527,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 698679d..e1d3e27 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1257,7 +1257,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 d852f96..a070307 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -579,7 +579,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 2ea5a4a..b8d29e1 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 25f36dc..ee845a9 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -111,9 +111,10 @@ typedef struct HDGeometry { /* * Allocation status flags - * BDRV_BLOCK_DATA: data is read from bs->file or another file + * BDRV_BLOCK_DATA: data is read from a file returned by bdrv_get_block_status. * 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 as raw data in a file returned by + * bdrv_get_block_status. * 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 @@ -386,11 +387,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 428fa33..5fa58e8 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 33e451c..e653b2f 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -1072,13 +1072,15 @@ static int img_compare(int argc, char **argv) for (;;) { int64_t status1, status2; + BlockDriverState *file; + nb_sectors = sectors_to_process(total_sectors, sector_num); if (nb_sectors <= 0) { break; } status1 = bdrv_get_block_status_above(bs1, NULL, sector_num, total_sectors1 - sector_num, - &pnum1); + &pnum1, &file); if (status1 < 0) { ret = 3; error_report("Sector allocation test failed for %s", filename1); @@ -1088,7 +1090,7 @@ static int img_compare(int argc, char **argv) status2 = bdrv_get_block_status_above(bs2, NULL, sector_num, total_sectors2 - sector_num, - &pnum2); + &pnum2, &file); if (status2 < 0) { ret = 3; error_report("Sector allocation test failed for %s", filename2); @@ -1271,9 +1273,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; } @@ -2201,6 +2204,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 @@ -2209,7 +2213,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] 23+ messages in thread
* Re: [Qemu-devel] [PATCH v9 01/16] block: Add "file" output parameter to block status query functions 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 01/16] block: Add "file" output parameter to block status query functions Fam Zheng @ 2016-01-27 18:14 ` Max Reitz 0 siblings, 0 replies; 23+ messages in thread From: Max Reitz @ 2016-01-27 18:14 UTC (permalink / raw) To: Fam Zheng, qemu-devel; +Cc: Kevin Wolf, pbonzini, Stefan Hajnoczi, qemu-block [-- Attachment #1: Type: text/plain, Size: 1397 bytes --] On 26.01.2016 04:58, 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 | 40 ++++++++++++++++++++++++++++------------ > 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 | 11 +++++++---- > include/block/block_int.h | 3 ++- > qemu-img.c | 13 +++++++++---- > 17 files changed, 66 insertions(+), 35 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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 02/16] qcow: Assign bs->file->bs to file in qcow_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 01/16] block: Add "file" output parameter to block status query functions Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 03/16] qcow2: Assign bs->file->bs to file in qcow2_co_get_block_status Fam Zheng ` (14 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 4202797..251910c 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -510,6 +510,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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 03/16] qcow2: Assign bs->file->bs to file in qcow2_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 01/16] block: Add "file" output parameter to block status query functions Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 02/16] qcow: Assign bs->file->bs to file in qcow_co_get_block_status Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 04/16] raw: Assign bs to file in raw_co_get_block_status Fam Zheng ` (13 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 d4ea6b4..8babecd 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -1349,6 +1349,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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 04/16] raw: Assign bs to file in raw_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (2 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 03/16] qcow2: Assign bs->file->bs to file in qcow2_co_get_block_status Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-27 18:16 ` Max Reitz 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 05/16] iscsi: Assign bs to file in iscsi_co_get_block_status Fam Zheng ` (12 subsequent siblings) 16 siblings, 1 reply; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini 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 3ef9b25..8866121 100644 --- a/block/raw-posix.c +++ b/block/raw-posix.c @@ -1861,6 +1861,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 9a8933b..ea16a23 100644 --- a/block/raw_bsd.c +++ b/block/raw_bsd.c @@ -119,6 +119,7 @@ static int64_t coroutine_fn raw_co_get_block_status(BlockDriverState *bs, BlockDriverState **file) { *pnum = nb_sectors; + *file = bs->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] 23+ messages in thread
* Re: [Qemu-devel] [PATCH v9 04/16] raw: Assign bs to file in raw_co_get_block_status 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 04/16] raw: Assign bs to file in raw_co_get_block_status Fam Zheng @ 2016-01-27 18:16 ` Max Reitz 0 siblings, 0 replies; 23+ messages in thread From: Max Reitz @ 2016-01-27 18:16 UTC (permalink / raw) To: Fam Zheng, qemu-devel; +Cc: Kevin Wolf, pbonzini, Stefan Hajnoczi, qemu-block [-- Attachment #1: Type: text/plain, Size: 233 bytes --] On 26.01.2016 04:58, Fam Zheng wrote: > Signed-off-by: Fam Zheng <famz@redhat.com> > --- > block/raw-posix.c | 1 + > block/raw_bsd.c | 1 + > 2 files changed, 2 insertions(+) Reviewed-by: Max Reitz <mreitz@redhat.com> [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 23+ messages in thread
* [Qemu-devel] [PATCH v9 05/16] iscsi: Assign bs to file in iscsi_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (3 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 04/16] raw: Assign bs to file in raw_co_get_block_status Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 06/16] parallels: Assign bs->file->bs to file in parallels_co_get_block_status Fam Zheng ` (11 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 e182557..9fe76f4 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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 06/16] parallels: Assign bs->file->bs to file in parallels_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (4 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 05/16] iscsi: Assign bs to file in iscsi_co_get_block_status Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 07/16] qed: Assign bs->file->bs to file in bdrv_qed_co_get_block_status Fam Zheng ` (10 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 e2de308..645521d 100644 --- a/block/parallels.c +++ b/block/parallels.c @@ -274,6 +274,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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 07/16] qed: Assign bs->file->bs to file in bdrv_qed_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (5 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 06/16] parallels: Assign bs->file->bs to file in parallels_co_get_block_status Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 08/16] sheepdog: Assign bs to file in sd_co_get_block_status Fam Zheng ` (9 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 8f6f841..404be1e 100644 --- a/block/qed.c +++ b/block/qed.c @@ -693,6 +693,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) @@ -704,6 +705,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; @@ -735,6 +737,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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 08/16] sheepdog: Assign bs to file in sd_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (6 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 07/16] qed: Assign bs->file->bs to file in bdrv_qed_co_get_block_status Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 09/16] vdi: Assign bs->file->bs to file in vdi_co_get_block_status Fam Zheng ` (8 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 2ea05a6..a0098c1 100644 --- a/block/sheepdog.c +++ b/block/sheepdog.c @@ -2739,6 +2739,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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 09/16] vdi: Assign bs->file->bs to file in vdi_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (7 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 08/16] sheepdog: Assign bs to file in sd_co_get_block_status Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 10/16] vpc: Assign bs->file->bs to file in vpc_co_get_block_status Fam Zheng ` (7 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 294c438..b403243 100644 --- a/block/vdi.c +++ b/block/vdi.c @@ -551,6 +551,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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 10/16] vpc: Assign bs->file->bs to file in vpc_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (8 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 09/16] vdi: Assign bs->file->bs to file in vdi_co_get_block_status Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 11/16] vmdk: Fix calculation of block status's offset Fam Zheng ` (6 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 a070307..f504536 100644 --- a/block/vpc.c +++ b/block/vpc.c @@ -589,6 +589,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); } @@ -610,6 +611,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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 11/16] vmdk: Fix calculation of block status's offset 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (9 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 10/16] vpc: Assign bs->file->bs to file in vpc_co_get_block_status Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-27 18:23 ` Max Reitz 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 12/16] vmdk: Return extent's file in bdrv_get_block_status Fam Zheng ` (5 subsequent siblings) 16 siblings, 1 reply; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini "offset" is the offset of cluster and sector_num doesn't necessarily refer to the start of it, it should add index_in_cluster. Signed-off-by: Fam Zheng <famz@redhat.com> --- block/vmdk.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index e1d3e27..61ed207 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1274,6 +1274,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; @@ -1287,13 +1288,14 @@ static int64_t coroutine_fn vmdk_co_get_block_status(BlockDriverState *bs, case VMDK_OK: ret = BDRV_BLOCK_DATA; if (extent->file == bs->file && !extent->compressed) { - ret |= BDRV_BLOCK_OFFSET_VALID | offset; + ret |= BDRV_BLOCK_OFFSET_VALID; + ret |= (offset + (index_in_cluster << BDRV_SECTOR_BITS)) + & BDRV_BLOCK_OFFSET_MASK; } 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] 23+ messages in thread
* Re: [Qemu-devel] [PATCH v9 11/16] vmdk: Fix calculation of block status's offset 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 11/16] vmdk: Fix calculation of block status's offset Fam Zheng @ 2016-01-27 18:23 ` Max Reitz 0 siblings, 0 replies; 23+ messages in thread From: Max Reitz @ 2016-01-27 18:23 UTC (permalink / raw) To: Fam Zheng, qemu-devel; +Cc: Kevin Wolf, pbonzini, Stefan Hajnoczi, qemu-block [-- Attachment #1: Type: text/plain, Size: 357 bytes --] On 26.01.2016 04:58, Fam Zheng wrote: > "offset" is the offset of cluster and sector_num doesn't necessarily > refer to the start of it, it should add index_in_cluster. > > Signed-off-by: Fam Zheng <famz@redhat.com> > --- > block/vmdk.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 12/16] vmdk: Return extent's file in bdrv_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (10 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 11/16] vmdk: Fix calculation of block status's offset Fam Zheng @ 2016-01-26 3:58 ` Fam Zheng 2016-01-27 18:25 ` Max Reitz 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 13/16] block: Use returned *file in bdrv_co_get_block_status Fam Zheng ` (4 subsequent siblings) 16 siblings, 1 reply; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:58 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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index 61ed207..f8f7fcf 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1287,12 +1287,12 @@ 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) { + 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; } -- 2.4.3 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH v9 12/16] vmdk: Return extent's file in bdrv_get_block_status 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 12/16] vmdk: Return extent's file in bdrv_get_block_status Fam Zheng @ 2016-01-27 18:25 ` Max Reitz 0 siblings, 0 replies; 23+ messages in thread From: Max Reitz @ 2016-01-27 18:25 UTC (permalink / raw) To: Fam Zheng, qemu-devel; +Cc: Kevin Wolf, pbonzini, Stefan Hajnoczi, qemu-block [-- Attachment #1: Type: text/plain, Size: 218 bytes --] On 26.01.2016 04:58, Fam Zheng wrote: > Signed-off-by: Fam Zheng <famz@redhat.com> > --- > block/vmdk.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 13/16] block: Use returned *file in bdrv_co_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (11 preceding siblings ...) 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 12/16] vmdk: Return extent's file in bdrv_get_block_status Fam Zheng @ 2016-01-26 3:59 ` Fam Zheng 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 14/16] qemu-img: In "map", use the returned "file" from bdrv_get_block_status Fam Zheng ` (3 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:59 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 use it. Signed-off-by: Fam Zheng <famz@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> --- block/io.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/block/io.c b/block/io.c index ea040be..343ff1f 100644 --- a/block/io.c +++ b/block/io.c @@ -1554,13 +1554,13 @@ static int64_t coroutine_fn bdrv_co_get_block_status(BlockDriverState *bs, } } - if (bs->file && + if (*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, + 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 -- 2.4.3 ^ permalink raw reply related [flat|nested] 23+ messages in thread
* [Qemu-devel] [PATCH v9 14/16] qemu-img: In "map", use the returned "file" from bdrv_get_block_status 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (12 preceding siblings ...) 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 13/16] block: Use returned *file in bdrv_co_get_block_status Fam Zheng @ 2016-01-26 3:59 ` Fam Zheng 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 15/16] qemu-img: Make MapEntry a QAPI struct Fam Zheng ` (2 subsequent siblings) 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:59 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 e653b2f..c8bc63f 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -2236,7 +2236,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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 15/16] qemu-img: Make MapEntry a QAPI struct 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (13 preceding siblings ...) 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 14/16] qemu-img: In "map", use the returned "file" from bdrv_get_block_status Fam Zheng @ 2016-01-26 3:59 ` Fam Zheng 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 16/16] iotests: Add "qemu-img map" test for VMDK extents Fam Zheng 2016-01-27 18:44 ` [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Max Reitz 16 siblings, 0 replies; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:59 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 0a915ed..30c2e5f 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 c8bc63f..f121980 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -2147,47 +2147,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('}'); @@ -2233,13 +2223,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; @@ -2321,10 +2337,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] 23+ messages in thread
* [Qemu-devel] [PATCH v9 16/16] iotests: Add "qemu-img map" test for VMDK extents 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (14 preceding siblings ...) 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 15/16] qemu-img: Make MapEntry a QAPI struct Fam Zheng @ 2016-01-26 3:59 ` Fam Zheng 2016-01-27 18:28 ` Max Reitz 2016-01-27 18:44 ` [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Max Reitz 16 siblings, 1 reply; 23+ messages in thread From: Fam Zheng @ 2016-01-26 3:59 UTC (permalink / raw) To: qemu-devel; +Cc: Kevin Wolf, qemu-block, mreitz, Stefan Hajnoczi, pbonzini Signed-off-by: Fam Zheng <famz@redhat.com> --- tests/qemu-iotests/059 | 10 ++++++++++ tests/qemu-iotests/059.out | 25 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/tests/qemu-iotests/059 b/tests/qemu-iotests/059 index 0ded0c3..0332bbb 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 monolithicSparse twoGbMaxExtentSparse; 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 9d506cb..678adb4 100644 --- a/tests/qemu-iotests/059.out +++ b/tests/qemu-iotests/059.out @@ -2335,6 +2335,31 @@ 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=monolithicSparse +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 0x3f0000 TEST_DIR/iotest-version3.vmdk +0x7fff0000 0x20000 0x410000 TEST_DIR/iotest-version3.vmdk +0x140000000 0x10000 0x430000 TEST_DIR/iotest-version3.vmdk +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 + === 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] 23+ messages in thread
* Re: [Qemu-devel] [PATCH v9 16/16] iotests: Add "qemu-img map" test for VMDK extents 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 16/16] iotests: Add "qemu-img map" test for VMDK extents Fam Zheng @ 2016-01-27 18:28 ` Max Reitz 0 siblings, 0 replies; 23+ messages in thread From: Max Reitz @ 2016-01-27 18:28 UTC (permalink / raw) To: Fam Zheng, qemu-devel; +Cc: Kevin Wolf, pbonzini, Stefan Hajnoczi, qemu-block [-- Attachment #1: Type: text/plain, Size: 287 bytes --] On 26.01.2016 04:59, Fam Zheng wrote: > Signed-off-by: Fam Zheng <famz@redhat.com> > --- > tests/qemu-iotests/059 | 10 ++++++++++ > tests/qemu-iotests/059.out | 25 +++++++++++++++++++++++++ > 2 files changed, 35 insertions(+) Reviewed-by: Max Reitz <mreitz@redhat.com> [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng ` (15 preceding siblings ...) 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 16/16] iotests: Add "qemu-img map" test for VMDK extents Fam Zheng @ 2016-01-27 18:44 ` Max Reitz 16 siblings, 0 replies; 23+ messages in thread From: Max Reitz @ 2016-01-27 18:44 UTC (permalink / raw) To: Fam Zheng, qemu-devel; +Cc: Kevin Wolf, pbonzini, Stefan Hajnoczi, qemu-block [-- Attachment #1: Type: text/plain, Size: 3774 bytes --] On 26.01.2016 04:58, Fam Zheng wrote: > v9: 01: Add comment for the new parameter, and remove the superfluous reset of > 'file'. [Kevin] > 04: bs => bs->file->bs. [Kevin] > 11: Split the bugfix. [Kevin] > 15: Don't corrupt 059.out. [Max] > > v8: Fix patch 15. [Max] > Add Max's rev-by in patch 1. > > v7: Rebase, update patch 1 for two new bdrv_get_block_status_above() callers in > qemu-img.c. [Max] > Add Max's rev-by in patch 12. > > 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 (16): > 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: Fix calculation of block status's offset > vmdk: Return extent's file in bdrv_get_block_status > block: Use returned *file 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 | 44 ++++++++++++++++-------- > 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 | 11 +++--- > include/block/block_int.h | 3 +- > qapi/block-core.json | 27 +++++++++++++++ > qemu-img.c | 84 ++++++++++++++++++++++++++++------------------ > tests/qemu-iotests/059 | 10 ++++++ > tests/qemu-iotests/059.out | 25 ++++++++++++++ > 20 files changed, 195 insertions(+), 70 deletions(-) Thanks, applied to my block tree: https://github.com/XanClic/qemu/commits/block Max [-- Attachment #2: OpenPGP digital signature --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 23+ messages in thread
end of thread, other threads:[~2016-01-27 18:45 UTC | newest] Thread overview: 23+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-01-26 3:58 [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 01/16] block: Add "file" output parameter to block status query functions Fam Zheng 2016-01-27 18:14 ` Max Reitz 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 02/16] qcow: Assign bs->file->bs to file in qcow_co_get_block_status Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 03/16] qcow2: Assign bs->file->bs to file in qcow2_co_get_block_status Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 04/16] raw: Assign bs to file in raw_co_get_block_status Fam Zheng 2016-01-27 18:16 ` Max Reitz 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 05/16] iscsi: Assign bs to file in iscsi_co_get_block_status Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 06/16] parallels: Assign bs->file->bs to file in parallels_co_get_block_status Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 07/16] qed: Assign bs->file->bs to file in bdrv_qed_co_get_block_status Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 08/16] sheepdog: Assign bs to file in sd_co_get_block_status Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 09/16] vdi: Assign bs->file->bs to file in vdi_co_get_block_status Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 10/16] vpc: Assign bs->file->bs to file in vpc_co_get_block_status Fam Zheng 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 11/16] vmdk: Fix calculation of block status's offset Fam Zheng 2016-01-27 18:23 ` Max Reitz 2016-01-26 3:58 ` [Qemu-devel] [PATCH v9 12/16] vmdk: Return extent's file in bdrv_get_block_status Fam Zheng 2016-01-27 18:25 ` Max Reitz 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 13/16] block: Use returned *file in bdrv_co_get_block_status Fam Zheng 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 14/16] qemu-img: In "map", use the returned "file" from bdrv_get_block_status Fam Zheng 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 15/16] qemu-img: Make MapEntry a QAPI struct Fam Zheng 2016-01-26 3:59 ` [Qemu-devel] [PATCH v9 16/16] iotests: Add "qemu-img map" test for VMDK extents Fam Zheng 2016-01-27 18:28 ` Max Reitz 2016-01-27 18:44 ` [Qemu-devel] [PATCH v9 00/16] qemu-img map: Allow driver to return file of the allocated block Max Reitz
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).