qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 07/27] qcow2: Handle full/falloc preallocation i


From: Max Reitz
Subject: Re: [Qemu-devel] [PATCH 07/27] qcow2: Handle full/falloc preallocation in qcow2_create2()
Date: Mon, 12 Feb 2018 15:19:13 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.2

On 2018-02-08 20:23, Kevin Wolf wrote:
> Once qcow2_create2() can be called directly on an already existing node,
> we must provide the 'full' and 'falloc' preallocation modes outside of
> creating the image on the protocol layer. Fortunately, we have
> preallocated truncate now which can provide this functionality.

When reviewing the gluster patch, I noticed that this will break
full/falloc preallocation on anything but the file protocol because
nothing else yet supports preallocated truncate...

Max

> Signed-off-by: Kevin Wolf <address@hidden>
> Reviewed-by: Eric Blake <address@hidden>
> ---
>  block/qcow2.c | 28 +++++++++++++++++++---------
>  1 file changed, 19 insertions(+), 9 deletions(-)
> 
> diff --git a/block/qcow2.c b/block/qcow2.c
> index 3f08cff1fa..0316335614 100644
> --- a/block/qcow2.c
> +++ b/block/qcow2.c
> @@ -2845,6 +2845,25 @@ static int qcow2_create2(BlockdevCreateOptions 
> *create_options, Error **errp)
>      }
>      blk_set_allow_write_beyond_eof(blk, true);
>  
> +    /* Clear the protocol layer and preallocate it if necessary */
> +    ret = blk_truncate(blk, 0, PREALLOC_MODE_OFF, errp);
> +    if (ret < 0) {
> +        goto out;
> +    }
> +
> +    if (qcow2_opts->preallocation == PREALLOC_MODE_FULL ||
> +        qcow2_opts->preallocation == PREALLOC_MODE_FALLOC)
> +    {
> +        int64_t prealloc_size =
> +            qcow2_calc_prealloc_size(qcow2_opts->size, cluster_size,
> +                                     refcount_order);
> +
> +        ret = blk_truncate(blk, prealloc_size, qcow2_opts->preallocation, 
> errp);
> +        if (ret < 0) {
> +            goto out;
> +        }
> +    }
> +
>      /* Write the header */
>      QEMU_BUILD_BUG_ON((1 << MIN_CLUSTER_BITS) < sizeof(*header));
>      header = g_malloc0(cluster_size);
> @@ -3081,15 +3100,6 @@ static int qcow2_create(const char *filename, QemuOpts 
> *opts, Error **errp)
>  
>  
>      /* Create and open the file (protocol layer) */
> -    if (prealloc == PREALLOC_MODE_FULL || prealloc == PREALLOC_MODE_FALLOC) {
> -        int refcount_order = ctz32(refcount_bits);
> -        int64_t prealloc_size =
> -            qcow2_calc_prealloc_size(size, cluster_size, refcount_order);
> -        qemu_opt_set_number(opts, BLOCK_OPT_SIZE, prealloc_size, 
> &error_abort);
> -        qemu_opt_set(opts, BLOCK_OPT_PREALLOC, PreallocMode_str(prealloc),
> -                     &error_abort);
> -    }
> -
>      ret = bdrv_create_file(filename, opts, errp);
>      if (ret < 0) {
>          goto finish;
> 


Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]