[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 07/36] qcow2: Handle full/falloc preallocation in
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH v3 07/36] qcow2: Handle full/falloc preallocation in qcow2_create2() |
Date: |
Fri, 23 Feb 2018 20:25:20 +0100 |
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.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Reviewed-by: Max Reitz <address@hidden>
---
block/qcow2.c | 28 +++++++++++++++++++---------
1 file changed, 19 insertions(+), 9 deletions(-)
diff --git a/block/qcow2.c b/block/qcow2.c
index 9a2028b3cf..64bf2863cd 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2872,6 +2872,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);
@@ -3108,15 +3127,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;
--
2.13.6
- [Qemu-devel] [PATCH v3 00/36] x-blockdev-create for protocols and qcow2, Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 01/36] block/qapi: Introduce BlockdevCreateOptions, Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 02/36] block/qapi: Add qcow2 create options to schema, Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 05/36] qcow2: Use BlockdevRef in qcow2_create2(), Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 06/36] qcow2: Use QCryptoBlockCreateOptions in qcow2_create2(), Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 03/36] qcow2: Let qcow2_create() handle protocol layer, Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 04/36] qcow2: Pass BlockdevCreateOptions to qcow2_create2(), Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 07/36] qcow2: Handle full/falloc preallocation in qcow2_create2(),
Kevin Wolf <=
- [Qemu-devel] [PATCH v3 08/36] util: Add qemu_opts_to_qdict_filtered(), Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 11/36] qdict: Introduce qdict_rename_keys(), Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 09/36] test-qemu-opts: Test qemu_opts_append(), Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 10/36] test-qemu-opts: Test qemu_opts_to_qdict_filtered(), Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 13/36] block: Make bdrv_is_whitelisted() public, Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 16/36] file-win32: Support .bdrv_co_create, Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 14/36] block: x-blockdev-create QMP command, Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 15/36] file-posix: Support .bdrv_co_create, Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 12/36] qcow2: Use visitor for options in qcow2_create(), Kevin Wolf, 2018/02/23
- [Qemu-devel] [PATCH v3 17/36] gluster: Support .bdrv_co_create, Kevin Wolf, 2018/02/23