From: Anthony Liguori <anthony@codemonkey.ws>
To: Kevin Wolf <kwolf@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH] qcow2: Add full image preallocation option
Date: Thu, 27 Jan 2011 11:45:55 -0600 [thread overview]
Message-ID: <4D41AF53.8070701@codemonkey.ws> (raw)
In-Reply-To: <1296143534-13495-1-git-send-email-kwolf@redhat.com>
On 01/27/2011 09:52 AM, Kevin Wolf wrote:
> This adds a preallocation=full mode to qcow2 image creation, which does not
> only allocate metadata for the whole image, but also writes zeros to it,
> creating a non-sparse image file.
>
The writing zeros bit is in order to support physical devices? Would it
be better to have a flag in BlockDriverState that indicated whether
uninitialized sectors could be assumed to be zero filled and key off of
that?
Regards,
Anthony Liguori
> Signed-off-by: Kevin Wolf<kwolf@redhat.com>
> ---
> block/qcow2.c | 45 ++++++++++++++++++++++++++++++++++++++++-----
> 1 files changed, 40 insertions(+), 5 deletions(-)
>
> diff --git a/block/qcow2.c b/block/qcow2.c
> index a1773e4..90cf2ca 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -838,7 +838,15 @@ static int qcow2_change_backing_file(BlockDriverState *bs,
> return qcow2_update_ext_header(bs, backing_file, backing_fmt);
> }
>
> -static int preallocate(BlockDriverState *bs)
> +enum prealloc_mode {
> + PREALLOC_OFF = 0,
> + PREALLOC_METADATA,
> + PREALLOC_FULL,
> +};
> +
> +#define IO_BUF_SIZE (2 * 1024 * 1024)
> +
> +static int preallocate(BlockDriverState *bs, enum prealloc_mode mode)
> {
> uint64_t nb_sectors;
> uint64_t offset;
> @@ -846,11 +854,14 @@ static int preallocate(BlockDriverState *bs)
> int ret;
> QCowL2Meta meta;
>
> + assert(mode != PREALLOC_OFF);
> +
> nb_sectors = bdrv_getlength(bs)>> 9;
> offset = 0;
> QLIST_INIT(&meta.dependent_requests);
> meta.cluster_offset = 0;
>
> + /* First allocate metadata in _really_ big chunks */
> while (nb_sectors) {
> num = MIN(nb_sectors, INT_MAX>> 9);
> ret = qcow2_alloc_cluster_offset(bs, offset, 0, num,&num,&meta);
> @@ -874,6 +885,28 @@ static int preallocate(BlockDriverState *bs)
> offset += num<< 9;
> }
>
> + /* Then write zeros to the cluster data, if requested */
> + if (mode == PREALLOC_FULL) {
> + void *buf = qemu_mallocz(IO_BUF_SIZE);
> +
> + nb_sectors = bdrv_getlength(bs)>> BDRV_SECTOR_BITS;
> + offset = 0;
> +
> + while (nb_sectors) {
> + num = MIN(nb_sectors, IO_BUF_SIZE / BDRV_SECTOR_SIZE);
> + ret = bdrv_write(bs, offset>> BDRV_SECTOR_BITS, buf, num);
> + if (ret< 0) {
> + qemu_free(buf);
> + return ret;
> + }
> +
> + nb_sectors -= num;
> + offset += num<< 9;
> + }
> +
> + qemu_free(buf);
> + }
> +
> /*
> * It is expected that the image file is large enough to actually contain
> * all of the allocated clusters (otherwise we get failing reads after
> @@ -1006,7 +1039,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
>
> /* And if we're supposed to preallocate metadata, do that now */
> if (prealloc) {
> - ret = preallocate(bs);
> + ret = preallocate(bs, prealloc);
> if (ret< 0) {
> goto out;
> }
> @@ -1043,9 +1076,11 @@ static int qcow2_create(const char *filename, QEMUOptionParameter *options)
> }
> } else if (!strcmp(options->name, BLOCK_OPT_PREALLOC)) {
> if (!options->value.s || !strcmp(options->value.s, "off")) {
> - prealloc = 0;
> + prealloc = PREALLOC_OFF;
> } else if (!strcmp(options->value.s, "metadata")) {
> - prealloc = 1;
> + prealloc = PREALLOC_METADATA;
> + } else if (!strcmp(options->value.s, "full")) {
> + prealloc = PREALLOC_FULL;
> } else {
> fprintf(stderr, "Invalid preallocation mode: '%s'\n",
> options->value.s);
> @@ -1336,7 +1371,7 @@ static QEMUOptionParameter qcow2_create_options[] = {
> {
> .name = BLOCK_OPT_PREALLOC,
> .type = OPT_STRING,
> - .help = "Preallocation mode (allowed values: off, metadata)"
> + .help = "Preallocation mode (allowed values: off, metadata, full)"
> },
> { NULL }
> };
>
next prev parent reply other threads:[~2011-01-27 17:46 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-01-27 15:52 [Qemu-devel] [PATCH] qcow2: Add full image preallocation option Kevin Wolf
2011-01-27 15:58 ` Daniel P. Berrange
2011-01-27 17:50 ` Anthony Liguori
2011-01-28 8:46 ` Kevin Wolf
2011-01-28 8:22 ` Kevin Wolf
2011-01-28 10:49 ` Daniel P. Berrange
2011-01-27 17:45 ` Anthony Liguori [this message]
2011-02-04 10:59 ` Stefan Hajnoczi
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=4D41AF53.8070701@codemonkey.ws \
--to=anthony@codemonkey.ws \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.