mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
block: add bdrv_measure() API
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 <stefanha@redhat.com> Reviewed-by: Alberto Garcia <berto@igalia.com> Message-id: 20170705125738.8777-2-stefanha@redhat.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
b43671f80c
commit
90880ff107
4 changed files with 64 additions and 0 deletions
35
block.c
35
block.c
|
@ -3463,6 +3463,41 @@ int64_t bdrv_get_allocated_file_size(BlockDriverState *bs)
|
|||
return -ENOTSUP;
|
||||
}
|
||||
|
||||
/*
|
||||
* bdrv_measure:
|
||||
* @drv: Format driver
|
||||
* @opts: Creation options for new image
|
||||
* @in_bs: Existing image containing data for new image (may be NULL)
|
||||
* @errp: Error object
|
||||
* Returns: A #BlockMeasureInfo (free using qapi_free_BlockMeasureInfo())
|
||||
* or NULL on error
|
||||
*
|
||||
* 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 may be 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.
|
||||
*
|
||||
* If an error occurs the @errp pointer is set.
|
||||
*/
|
||||
BlockMeasureInfo *bdrv_measure(BlockDriver *drv, QemuOpts *opts,
|
||||
BlockDriverState *in_bs, Error **errp)
|
||||
{
|
||||
if (!drv->bdrv_measure) {
|
||||
error_setg(errp, "Block driver '%s' does not support size measurement",
|
||||
drv->format_name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return drv->bdrv_measure(opts, in_bs, errp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return number of sectors on success, -errno on error.
|
||||
*/
|
||||
|
|
|
@ -306,6 +306,8 @@ int bdrv_truncate(BdrvChild *child, int64_t offset, Error **errp);
|
|||
int64_t bdrv_nb_sectors(BlockDriverState *bs);
|
||||
int64_t bdrv_getlength(BlockDriverState *bs);
|
||||
int64_t bdrv_get_allocated_file_size(BlockDriverState *bs);
|
||||
BlockMeasureInfo *bdrv_measure(BlockDriver *drv, QemuOpts *opts,
|
||||
BlockDriverState *in_bs, 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);
|
||||
|
|
|
@ -209,6 +209,8 @@ struct BlockDriver {
|
|||
int64_t (*bdrv_getlength)(BlockDriverState *bs);
|
||||
bool has_variable_length;
|
||||
int64_t (*bdrv_get_allocated_file_size)(BlockDriverState *bs);
|
||||
BlockMeasureInfo *(*bdrv_measure)(QemuOpts *opts, BlockDriverState *in_bs,
|
||||
Error **errp);
|
||||
|
||||
int coroutine_fn (*bdrv_co_pwritev_compressed)(BlockDriverState *bs,
|
||||
uint64_t offset, uint64_t bytes, QEMUIOVector *qiov);
|
||||
|
|
|
@ -487,6 +487,31 @@
|
|||
'*tray_open': 'bool', '*io-status': 'BlockDeviceIoStatus',
|
||||
'*dirty-bitmaps': ['BlockDirtyInfo'] } }
|
||||
|
||||
##
|
||||
# @BlockMeasureInfo:
|
||||
#
|
||||
# Image file size calculation information. This structure describes the size
|
||||
# requirements for creating a new image file.
|
||||
#
|
||||
# The size requirements depend on the new image file format. File size always
|
||||
# equals virtual disk size for the 'raw' format, even for sparse POSIX files.
|
||||
# Compact formats such as 'qcow2' represent unallocated and zero regions
|
||||
# efficiently so file size may be smaller than virtual disk size.
|
||||
#
|
||||
# The values are upper bounds that are guaranteed to fit the new image file.
|
||||
# Subsequent modification, such as internal snapshot or bitmap creation, may
|
||||
# require additional space and is not covered here.
|
||||
#
|
||||
# @required: Size required for a new image file, in bytes.
|
||||
#
|
||||
# @fully-allocated: Image file size, in bytes, once data has been written
|
||||
# to all sectors.
|
||||
#
|
||||
# Since: 2.10
|
||||
##
|
||||
{ 'struct': 'BlockMeasureInfo',
|
||||
'data': {'required': 'int', 'fully-allocated': 'int'} }
|
||||
|
||||
##
|
||||
# @query-block:
|
||||
#
|
||||
|
|
Loading…
Reference in a new issue