qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Hajnoczi <stefanha@gmail.com>
To: Hu Tao <hutao@cn.fujitsu.com>
Cc: Kevin Wolf <kwolf@redhat.com>, Fam Zheng <famz@redhat.com>,
	Peter Lieven <pl@kamp.de>,
	qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [RFC PATCH v4 4/4] qcow2: Add full image preallocation option
Date: Fri, 17 Jan 2014 16:48:16 +0800	[thread overview]
Message-ID: <20140117084816.GC31039@stefanha-thinkpad.redhat.com> (raw)
In-Reply-To: <25565d3a53f29829dc2d97480cb19ba34be49895.1388112645.git.hutao@cn.fujitsu.com>

On Fri, Dec 27, 2013 at 11:05:54AM +0800, Hu Tao wrote:

This approach seems okay but the calculation isn't quite right yet.

On Windows an error would be raised since we don't have preallocate=full
support.  That's okay.

> @@ -1477,16 +1478,53 @@ static int qcow2_create2(const char *filename, int64_t total_size,
>      Error *local_err = NULL;
>      int ret;
>  
> +    if (prealloc == PREALLOC_MODE_FULL) {
> +        int64_t meta_size = 0;
> +        unsigned nrefe, nl2e;
> +        BlockDriver *drv;
> +
> +        drv = bdrv_find_protocol(filename, true);
> +        if (drv == NULL) {
> +            error_setg(errp, "Could not find protocol for file '%s'", filename);
> +            return -ENOENT;
> +        }
> +
> +        alloc_options = append_option_parameters(alloc_options,
> +                                                 drv->create_options);
> +        alloc_options = append_option_parameters(alloc_options, options);
> +
> +        /* header: 1 cluster */
> +        meta_size += cluster_size;
> +        /* total size of refblocks */
> +        nrefe = (total_size / cluster_size);
> +        nrefe = align_offset(nrefe, cluster_size / sizeof(uint16_t));
> +        meta_size += nrefe * sizeof(uint16_t);

Every host cluster is reference-counted, including metadata (even
refcount blocks are recursively included).  This calculation is wrong
because it only considers data clusters.

> +        /* total size of reftables */
> +        meta_size += nrefe * sizeof(uint16_t) * sizeof(uint16_t) / cluster_size;

I don't understand this calculation.  The refcount table consists of
contiguous clusters where each element is a 64-bit offset to a refcount
block.

> +        /* total size of L2 tables */
> +        nl2e = total_size / cluster_size;
> +        nl2e = align_offset(nl2e, cluster_size / sizeof(uint64_t));
> +        meta_size += nl2e * sizeof(uint64_t);
> +        /* total size of L1 tables */
> +        meta_size += nl2e * sizeof(uint64_t) * sizeof(uint64_t) / cluster_size;

Another strange calculation.  The L1 table consists of contiguous
clusters where each element is a 64-bit offset to an L1 table.

  reply	other threads:[~2014-01-17  8:48 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-12-27  3:05 [Qemu-devel] [RFC PATCH v4 0/4] qemu-img: add preallocation=full Hu Tao
2013-12-27  3:05 ` [Qemu-devel] [RFC PATCH v4 1/4] qapi: introduce PreallocMode Hu Tao
2013-12-27  3:05 ` [Qemu-devel] [RFC PATCH v4 2/4] raw, qcow2: don't convert file size to sector size Hu Tao
2013-12-27  3:05 ` [Qemu-devel] [RFC PATCH v4 3/4] raw-posix: Add full image preallocation option Hu Tao
2014-01-17  8:25   ` Stefan Hajnoczi
2014-01-20  2:19     ` Hu Tao
2014-01-17  8:56   ` Stefan Hajnoczi
2014-01-20  2:27     ` Hu Tao
2013-12-27  3:05 ` [Qemu-devel] [RFC PATCH v4 4/4] qcow2: " Hu Tao
2014-01-17  8:48   ` Stefan Hajnoczi [this message]
2014-01-20  2:16     ` Hu Tao
2014-02-07  2:22       ` Hu Tao
2014-01-06  7:27 ` [Qemu-devel] [RFC PATCH v4 0/4] qemu-img: add preallocation=full Hu Tao
2014-01-13 10:26   ` Hu Tao
2014-01-17  9:05 ` 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=20140117084816.GC31039@stefanha-thinkpad.redhat.com \
    --to=stefanha@gmail.com \
    --cc=famz@redhat.com \
    --cc=hutao@cn.fujitsu.com \
    --cc=kwolf@redhat.com \
    --cc=pl@kamp.de \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).