Commit ffeaac9b authored by Hu Tao's avatar Hu Tao Committed by Kevin Wolf
Browse files

qapi: introduce PreallocMode and new PreallocModes full and falloc.



This patch prepares for the subsequent patches.

Signed-off-by: default avatarHu Tao <hutao@cn.fujitsu.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 180e9526
Loading
Loading
Loading
Loading
+18 −10
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@
#include "qemu/error-report.h"
#include "qapi/qmp/qerror.h"
#include "qapi/qmp/qbool.h"
#include "qapi/util.h"
#include "trace.h"
#include "qemu/option_int.h"

@@ -1738,7 +1739,7 @@ static int preallocate(BlockDriverState *bs)

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, int prealloc,
                         int flags, size_t cluster_size, PreallocMode prealloc,
                         QemuOpts *opts, int version,
                         Error **errp)
{
@@ -1876,7 +1877,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
    }

    /* And if we're supposed to preallocate metadata, do that now */
    if (prealloc) {
    if (prealloc == PREALLOC_MODE_METADATA) {
        BDRVQcowState *s = bs->opaque;
        qemu_co_mutex_lock(&s->lock);
        ret = preallocate(bs);
@@ -1915,7 +1916,7 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
    uint64_t size = 0;
    int flags = 0;
    size_t cluster_size = DEFAULT_CLUSTER_SIZE;
    int prealloc = 0;
    PreallocMode prealloc;
    int version = 3;
    Error *local_err = NULL;
    int ret;
@@ -1931,12 +1932,11 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
    cluster_size = qemu_opt_get_size_del(opts, BLOCK_OPT_CLUSTER_SIZE,
                                         DEFAULT_CLUSTER_SIZE);
    buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
    if (!buf || !strcmp(buf, "off")) {
        prealloc = 0;
    } else if (!strcmp(buf, "metadata")) {
        prealloc = 1;
    } else {
        error_setg(errp, "Invalid preallocation mode: '%s'", buf);
    prealloc = qapi_enum_parse(PreallocMode_lookup, buf,
                               PREALLOC_MODE_MAX, PREALLOC_MODE_OFF,
                               &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        ret = -EINVAL;
        goto finish;
    }
@@ -1958,7 +1958,15 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
        flags |= BLOCK_FLAG_LAZY_REFCOUNTS;
    }

    if (backing_file && prealloc) {
    if (prealloc != PREALLOC_MODE_OFF &&
        prealloc != PREALLOC_MODE_METADATA) {
        ret = -EINVAL;
        error_setg(errp, "Unsupported preallocate mode: %s",
                   PreallocMode_lookup[prealloc]);
        goto finish;
    }

    if (backing_file && prealloc != PREALLOC_MODE_OFF) {
        error_setg(errp, "Backing file and preallocation cannot be used at "
                   "the same time");
        ret = -EINVAL;
+17 −0
Original line number Diff line number Diff line
@@ -1708,3 +1708,20 @@
            'len'   : 'int',
            'offset': 'int',
            'speed' : 'int' } }

# @PreallocMode
#
# Preallocation mode of QEMU image file
#
# @off: no preallocation
# @metadata: preallocate only for metadata
# @falloc: like @full preallocation but allocate disk space by
#          posix_fallocate() rather than writing zeros.
# @full: preallocate all data by writing zeros to device to ensure disk
#        space is really available. @full preallocation also sets up
#        metadata correctly.
#
# Since 2.2
##
{ 'enum': 'PreallocMode',
  'data': [ 'off', 'metadata', 'falloc', 'full' ] }
+1 −1
Original line number Diff line number Diff line
@@ -179,7 +179,7 @@ qemu-img create -f qcow2 -o preallocation=metadata TEST_DIR/t.qcow2 64M
Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=67108864 encryption=off cluster_size=65536 preallocation='metadata' lazy_refcounts=off 

qemu-img create -f qcow2 -o preallocation=1234 TEST_DIR/t.qcow2 64M
qemu-img: TEST_DIR/t.qcow2: Invalid preallocation mode: '1234'
qemu-img: TEST_DIR/t.qcow2: invalid parameter value: 1234
Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=67108864 encryption=off cluster_size=65536 preallocation='1234' lazy_refcounts=off 

== Check encryption option ==