All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Maor Lipchuk <mlipchuk@redhat.com>,
	"Daniel P. Berrange" <berrange@redhat.com>,
	Nir Soffer <nsoffer@redhat.com>,
	Alberto Garcia <berto@igalia.com>, John Snow <jsnow@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v5 1/9] block: add bdrv_measure() API
Date: Tue, 18 Apr 2017 10:08:20 -0500	[thread overview]
Message-ID: <09309ca7-dea8-db26-5544-402964224ee1@redhat.com> (raw)
In-Reply-To: <20170418135726.28022-2-stefanha@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 4136 bytes --]

On 04/18/2017 08:57 AM, Stefan Hajnoczi 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 <stefanha@redhat.com>
> Reviewed-by: Alberto Garcia <berto@igalia.com>
> ---
>  qapi/block-core.json      | 25 +++++++++++++++++++++++++
>  include/block/block.h     |  4 ++++
>  include/block/block_int.h |  2 ++
>  block.c                   | 35 +++++++++++++++++++++++++++++++++++
>  4 files changed, 66 insertions(+)
> 
> diff --git a/qapi/block-core.json b/qapi/block-core.json
> index 033457c..1ea5536 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -463,6 +463,31 @@
>             '*dirty-bitmaps': ['BlockDirtyInfo'] } }
>  
>  ##
> +# @BlockMeasureInfo:
> +#
> +# Image 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.  Compact formats such as
> +# 'qcow2' represent unallocated and zero regions efficiently so file size may
> +# be smaller than virtual disk size.

I guess that implies that holes due to a file system that supports them
is NOT considered a compact format under qemu's control.  Or maybe
another way of wording it is that we are reporting the size of all guest
contents that are associated with a host offset by this layer (all
sectors of a raw format have a host offset, even if that offset falls in
the hole of a sparse file; but sectors of qcow2 do not necessarily have
a host offset if they are unallocated or zero).

But I'm not sure my alternative wording adds anything, so I'm also fine
if you don't feel like tweaking it any further.


> +#
> +# 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'} }
> +

> +++ 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,
> +                  Error **errp);

Would it be any better to have BlockMeasureInfo* be the return value (or
NULL on error), instead of an output-only parameter?  Of course, that
changes the allocation scheme (as written, a caller can stack-allocate
or malloc the pointer it passes in, but with a return value of a
pointer, it will always be malloc'd); on the other hand, the allocation
scheme may matter down the road if the struct ever gains a non-scalar
member where stack-allocation becomes harder to clean up than just
calling qapi_free_BlockMeasureInfo().


> +++ 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);

I know we haven't done a good job in the past, but should we start
trying to do better at documenting callback constraints of new things
added in this header?

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

  reply	other threads:[~2017-04-18 15:08 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-18 13:57 [Qemu-devel] [PATCH v5 0/9] qemu-img: add measure sub-command Stefan Hajnoczi
2017-04-18 13:57 ` [Qemu-devel] [PATCH v5 1/9] block: add bdrv_measure() API Stefan Hajnoczi
2017-04-18 15:08   ` Eric Blake [this message]
2017-04-19 13:27     ` Stefan Hajnoczi
2017-04-19 13:32       ` Eric Blake
2017-04-20 10:49         ` Stefan Hajnoczi
2017-04-18 13:57 ` [Qemu-devel] [PATCH v5 2/9] raw-format: add bdrv_measure() support Stefan Hajnoczi
2017-04-18 13:57 ` [Qemu-devel] [PATCH v5 3/9] qcow2: extract preallocation calculation function Stefan Hajnoczi
2017-04-18 13:57 ` [Qemu-devel] [PATCH v5 4/9] qcow2: make refcount size calculation conservative Stefan Hajnoczi
2017-05-08 13:15   ` Alberto Garcia
2017-04-18 13:57 ` [Qemu-devel] [PATCH v5 5/9] qcow2: extract image creation option parsing Stefan Hajnoczi
2017-04-18 13:57 ` [Qemu-devel] [PATCH v5 6/9] qcow2: add bdrv_measure() support Stefan Hajnoczi
2017-05-08 13:16   ` Alberto Garcia
2017-04-18 13:57 ` [Qemu-devel] [PATCH v5 7/9] qemu-img: add measure subcommand Stefan Hajnoczi
2017-05-08 14:17   ` Alberto Garcia
2017-04-18 13:57 ` [Qemu-devel] [PATCH v5 8/9] qemu-iotests: support per-format golden output files Stefan Hajnoczi
2017-05-08 13:18   ` Alberto Garcia
2017-04-18 13:57 ` [Qemu-devel] [PATCH v5 9/9] iotests: add test 178 for qemu-img measure Stefan Hajnoczi
2017-05-08 13:18   ` Alberto Garcia

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=09309ca7-dea8-db26-5544-402964224ee1@redhat.com \
    --to=eblake@redhat.com \
    --cc=berrange@redhat.com \
    --cc=berto@igalia.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mlipchuk@redhat.com \
    --cc=nsoffer@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.