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