qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Hu Tao <hutao@cn.fujitsu.com>, Kevin Wolf <kwolf@redhat.com>
Cc: Yasunori Goto <y-goto@jp.fujitsu.com>,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH RFC v11 6/6] qcow2: Add falloc and full preallocation option
Date: Thu, 03 Jul 2014 22:30:06 +0200	[thread overview]
Message-ID: <53B5BD4E.7090605@redhat.com> (raw)
In-Reply-To: <6583fb5f97a6d173be3865d2794ceb3cccf7c013.1404287261.git.hutao@cn.fujitsu.com>

On 02.07.2014 10:17, Hu Tao wrote:
> This adds preallocation=falloc and preallocation=full mode to qcow2
> image creation.
>
> preallocation=full allocates disk space by writing zeros to disk to
> ensure disk space in any cases.
>
> preallocation=falloc likes preallocation=full, but allocates disk space
> by posix_fallocate().
>
> Signed-off-by: Hu Tao <hutao@cn.fujitsu.com>
> ---
>   block/qcow2.c              | 29 ++++++++++++++++++++++++-
>   tests/qemu-iotests/082.out | 54 +++++++++++++++++++++++-----------------------
>   2 files changed, 55 insertions(+), 28 deletions(-)
>
> diff --git a/block/qcow2.c b/block/qcow2.c
> index cfba93b..f2df8cb 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -1593,6 +1593,9 @@ static int preallocate(BlockDriverState *bs)
>       return 0;
>   }
>   
> +static uint64_t minimal_blob_size(uint64_t ts, int cb, int spcb,
> +                                  uint64_t overhead);
> +
>   static int qcow2_create2(const char *filename, int64_t total_size,
>                            const char *backing_file, const char *backing_format,
>                            int flags, size_t cluster_size, PreallocMode prealloc,
> @@ -1628,6 +1631,29 @@ static int qcow2_create2(const char *filename, int64_t total_size,
>       Error *local_err = NULL;
>       int ret;
>   
> +    if (prealloc == PREALLOC_MODE_FULL || prealloc == PREALLOC_MODE_FALLOC) {
> +        int64_t meta_size = 0;
> +        unsigned nl2e;
> +
> +        total_size = align_offset(total_size, cluster_size);
> +
> +        /* total size of L2 tables */
> +        nl2e = total_size / cluster_size;

This might overflow, better use a uint64_t for nl2e. Also: You're using 
">> cluster_bits" below to divide by the cluster size; I'd prefer using 
the same method in both places (either ">> cluster_bits" or "/ 
cluster_size").

> +        nl2e = align_offset(nl2e, cluster_size / sizeof(uint64_t));
> +        uint64_t l2_clusters = nl2e * sizeof(uint64_t) >> cluster_bits;
> +
> +        meta_size =
> +            (1 +
> +             minimal_blob_size(total_size / BDRV_SECTOR_SIZE,
> +                               cluster_bits, cluster_bits - BDRV_SECTOR_BITS,
> +                               1 + l2_clusters +
> +                               (total_size >> cluster_bits)) +
> +             l2_clusters) << cluster_bits;
> +
> +        qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_size + meta_size);
> +        qemu_opt_set(opts, BLOCK_OPT_PREALLOC, PreallocMode_lookup[prealloc]);
> +    }
> +
>       ret = bdrv_create_file(filename, opts, &local_err);
>       if (ret < 0) {
>           error_propagate(errp, local_err);

Maybe I'd additionally change the "if (prealloc)" later in 
qcow2_create2() to "if (prealloc != PREALLOC_MODE_NONE)" to make it more 
clear that there is more than just one method of preallocation now.


Maybe we also want to modify preallocate() later on to allocate all 
metadata structures in a single block (because, who knows, we might want 
a linear layout for the data clusters for some strange reason), but 
currently there is no need for that.

Reviewed-by: Max Reitz <mreitz@redhat.com>

  reply	other threads:[~2014-07-03 20:30 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-02  8:17 [Qemu-devel] [PATCH RFC v11 0/6] qcow2, raw: add preallocation=full and preallocation=falloc Hu Tao
2014-07-02  8:17 ` [Qemu-devel] [PATCH RFC v11 1/6] block: round up file size to nearest sector Hu Tao
2014-07-02 13:29   ` [Qemu-devel] [PATCH for-2.1? " Eric Blake
2014-07-02  8:17 ` [Qemu-devel] [PATCH RFC v11 2/6] raw, qcow2: don't convert file size to sector size Hu Tao
2014-07-03 20:28   ` Eric Blake
2014-07-02  8:17 ` [Qemu-devel] [PATCH RFC v11 3/6] rename parse_enum_option to qapi_enum_parse and make it public Hu Tao
2014-07-03 20:29   ` Eric Blake
2014-07-02  8:17 ` [Qemu-devel] [PATCH RFC v11 4/6] qapi: introduce PreallocMode and a new PreallocMode full Hu Tao
2014-07-03 20:00   ` Max Reitz
2014-07-02  8:17 ` [Qemu-devel] [PATCH RFC v11 5/6] raw-posix: Add falloc and full preallocation option Hu Tao
2014-07-03 20:10   ` Max Reitz
2014-07-02  8:17 ` [Qemu-devel] [PATCH RFC v11 6/6] qcow2: " Hu Tao
2014-07-03 20:30   ` Max Reitz [this message]
2014-07-03 20:35   ` Max Reitz

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=53B5BD4E.7090605@redhat.com \
    --to=mreitz@redhat.com \
    --cc=hutao@cn.fujitsu.com \
    --cc=kwolf@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=y-goto@jp.fujitsu.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 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).