[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH 07/27] qcow2: Handle full/falloc preallocation i
From: |
Max Reitz |
Subject: |
Re: [Qemu-block] [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;
>
signature.asc
Description: OpenPGP digital signature
- [Qemu-block] [PATCH 03/27] qcow2: Let qcow2_create() handle protocol layer, (continued)
- [Qemu-block] [PATCH 03/27] qcow2: Let qcow2_create() handle protocol layer, Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 05/27] qcow2: Use BlockdevRef in qcow2_create2(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 06/27] qcow2: Use QCryptoBlockCreateOptions in qcow2_create2(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 07/27] qcow2: Handle full/falloc preallocation in qcow2_create2(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 08/27] util: Add qemu_opts_to_qdict_filtered(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 09/27] qdict: Introduce qdict_rename_keys(), Kevin Wolf, 2018/02/08
- [Qemu-block] [PATCH 10/27] qcow2: Use visitor for options in qcow2_create(), Kevin Wolf, 2018/02/08