On Wed, Mar 15, 2017 at 11:29 AM Stefan Hajnoczi <stefa...@redhat.com> wrote:
> bdrv_measure() provides a conservative maximum for the size of a new > image. This information is handy if storage needs to be allocated (e.g. > a SAN or an LVM volume) ahead of time. > > Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> > --- > qapi/block-core.json | 19 +++++++++++++++++++ > include/block/block.h | 4 ++++ > include/block/block_int.h | 2 ++ > block.c | 33 +++++++++++++++++++++++++++++++++ > 4 files changed, 58 insertions(+) > > diff --git a/qapi/block-core.json b/qapi/block-core.json > index 786b39e..673569d 100644 > --- a/qapi/block-core.json > +++ b/qapi/block-core.json > @@ -463,6 +463,25 @@ > '*dirty-bitmaps': ['BlockDirtyInfo'] } } > > ## > +# @BlockMeasureInfo: > +# > +# Image size calculation information. This structure describes the size > +# requirements for creating a new image. > +# > +# @required-bytes: Amount of space required for image creation. This > value is > +# the host file size including sparse file regions. A > new 5 > +# GB raw file therefore has a required size of 5 GB, not > 0 > +# bytes. > +# > +# @fully-allocated-bytes: Space required once data has been written to all > +# sectors > +# > +# Since: 2.10 > +## > +{ 'struct': 'BlockMeasureInfo', > + 'data': {'required-bytes': 'int', 'fully-allocated-bytes': 'int'} } > + > +## > # @query-block: > # > # Get a list of BlockInfo for all virtual block devices. > diff --git a/include/block/block.h b/include/block/block.h > index 5149260..43c789f 100644 > --- a/include/block/block.h > +++ b/include/block/block.h > @@ -298,6 +298,10 @@ int bdrv_truncate(BdrvChild *child, int64_t offset); > int64_t bdrv_nb_sectors(BlockDriverState *bs); > int64_t bdrv_getlength(BlockDriverState *bs); > int64_t bdrv_get_allocated_file_size(BlockDriverState *bs); > +void bdrv_measure(BlockDriver *drv, QemuOpts *opts, > + BlockDriverState *in_bs, > + BlockMeasureInfo *info, > The struct declaration is missing in this patch, right? > + Error **errp); > void bdrv_get_geometry(BlockDriverState *bs, uint64_t *nb_sectors_ptr); > void bdrv_refresh_limits(BlockDriverState *bs, Error **errp); > int bdrv_commit(BlockDriverState *bs); > diff --git a/include/block/block_int.h b/include/block/block_int.h > index 6c699ac..45a7fbe 100644 > --- a/include/block/block_int.h > +++ b/include/block/block_int.h > @@ -201,6 +201,8 @@ struct BlockDriver { > int64_t (*bdrv_getlength)(BlockDriverState *bs); > bool has_variable_length; > int64_t (*bdrv_get_allocated_file_size)(BlockDriverState *bs); > + void (*bdrv_measure)(QemuOpts *opts, BlockDriverState *in_bs, > + BlockMeasureInfo *info, Error **errp); > > int coroutine_fn (*bdrv_co_pwritev_compressed)(BlockDriverState *bs, > uint64_t offset, uint64_t bytes, QEMUIOVector *qiov); > diff --git a/block.c b/block.c > index cb57370..532a4d1 100644 > --- a/block.c > +++ b/block.c > @@ -3260,6 +3260,39 @@ int64_t > bdrv_get_allocated_file_size(BlockDriverState *bs) > return -ENOTSUP; > } > > +/* > + * bdrv_measure: > + * @drv: Format driver > + * @opts: Creation options > + * @in_bs: Existing image containing data for new image (may be NULL) > + * @info: Result object > + * @errp: Error object > + * > + * Calculate file size required to create a new image. > + * > + * If @in_bs is given then space for allocated clusters and zero clusters > + * from that image are included in the calculation. If @opts contains a > + * backing file that is shared by @in_bs then backing clusters are omitted > + * from the calculation. > + * > + * If @in_bs is NULL then the calculation includes no allocated clusters > + * unless a preallocation option is given in @opts. > + * > + * Note that @in_bs may use a different BlockDriver from @drv. > + */ > +void bdrv_measure(BlockDriver *drv, QemuOpts *opts, > + BlockDriverState *in_bs, BlockMeasureInfo *info, > + Error **errp) > +{ > + if (!drv->bdrv_measure) { > + error_setg(errp, "Block driver '%s' does not support size > measurement", > + drv->format_name); > + return; > + } > + > + drv->bdrv_measure(opts, in_bs, info, errp); > +} > + > /** > * Return number of sectors on success, -errno on error. > */ > -- > 2.9.3 > >