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 > Reviewed-by: Eric Blake > --- > 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; >