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 "qemu/error-report.h"
|
||||||
#include "qapi/qmp/qerror.h"
|
#include "qapi/qmp/qerror.h"
|
||||||
#include "qapi/qmp/qbool.h"
|
#include "qapi/qmp/qbool.h"
|
||||||
|
#include "qapi/util.h"
|
||||||
#include "trace.h"
|
#include "trace.h"
|
||||||
#include "qemu/option_int.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,
|
static int qcow2_create2(const char *filename, int64_t total_size,
|
||||||
const char *backing_file, const char *backing_format,
|
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,
|
QemuOpts *opts, int version,
|
||||||
Error **errp)
|
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 */
|
/* And if we're supposed to preallocate metadata, do that now */
|
||||||
if (prealloc) {
|
if (prealloc == PREALLOC_MODE_METADATA) {
|
||||||
BDRVQcowState *s = bs->opaque;
|
BDRVQcowState *s = bs->opaque;
|
||||||
qemu_co_mutex_lock(&s->lock);
|
qemu_co_mutex_lock(&s->lock);
|
||||||
ret = preallocate(bs);
|
ret = preallocate(bs);
|
||||||
@ -1915,7 +1916,7 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
|
|||||||
uint64_t size = 0;
|
uint64_t size = 0;
|
||||||
int flags = 0;
|
int flags = 0;
|
||||||
size_t cluster_size = DEFAULT_CLUSTER_SIZE;
|
size_t cluster_size = DEFAULT_CLUSTER_SIZE;
|
||||||
int prealloc = 0;
|
PreallocMode prealloc;
|
||||||
int version = 3;
|
int version = 3;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
int ret;
|
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,
|
cluster_size = qemu_opt_get_size_del(opts, BLOCK_OPT_CLUSTER_SIZE,
|
||||||
DEFAULT_CLUSTER_SIZE);
|
DEFAULT_CLUSTER_SIZE);
|
||||||
buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
|
buf = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
|
||||||
if (!buf || !strcmp(buf, "off")) {
|
prealloc = qapi_enum_parse(PreallocMode_lookup, buf,
|
||||||
prealloc = 0;
|
PREALLOC_MODE_MAX, PREALLOC_MODE_OFF,
|
||||||
} else if (!strcmp(buf, "metadata")) {
|
&local_err);
|
||||||
prealloc = 1;
|
if (local_err) {
|
||||||
} else {
|
error_propagate(errp, local_err);
|
||||||
error_setg(errp, "Invalid preallocation mode: '%s'", buf);
|
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto finish;
|
goto finish;
|
||||||
}
|
}
|
||||||
@ -1958,7 +1958,15 @@ static int qcow2_create(const char *filename, QemuOpts *opts, Error **errp)
|
|||||||
flags |= BLOCK_FLAG_LAZY_REFCOUNTS;
|
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 "
|
error_setg(errp, "Backing file and preallocation cannot be used at "
|
||||||
"the same time");
|
"the same time");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
@ -1708,3 +1708,20 @@
|
|||||||
'len' : 'int',
|
'len' : 'int',
|
||||||
'offset': 'int',
|
'offset': 'int',
|
||||||
'speed' : '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
|
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 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
|
Formatting 'TEST_DIR/t.qcow2', fmt=qcow2 size=67108864 encryption=off cluster_size=65536 preallocation='1234' lazy_refcounts=off
|
||||||
|
|
||||||
== Check encryption option ==
|
== Check encryption option ==
|
||||||
|
Loading…
Reference in New Issue
Block a user