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
					
				
							
								
								
									
										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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Stefan Hajnoczi
						Stefan Hajnoczi