qapi: introduce PreallocMode and new PreallocModes full and falloc.
This patch prepares for the subsequent patches. Signed-off-by: Hu Tao <hutao@cn.fujitsu.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
180e95265e
commit
ffeaac9b4e
@ -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;
|
||||
|
@ -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' ] }
|
||||
|
@ -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 ==
|
||||
|
Loading…
Reference in New Issue
Block a user