vhdx.c: replace QEMUOptionParameter with QemuOpts

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Dong Xu Wang <wdongxu@linux.vnet.ibm.com>
Signed-off-by: Chunyan Liu <cyliu@suse.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Chunyan Liu 2014-06-05 17:21:08 +08:00 committed by Stefan Hajnoczi
parent 004b7f2522
commit 5366092c7a
2 changed files with 48 additions and 52 deletions

View File

@ -1723,8 +1723,7 @@ exit:
* .---- ~ ----------- ~ ------------ ~ ---------------- ~ -----------. * .---- ~ ----------- ~ ------------ ~ ---------------- ~ -----------.
* 1MB * 1MB
*/ */
static int vhdx_create(const char *filename, QEMUOptionParameter *options, static int vhdx_create(const char *filename, QemuOpts *opts, Error **errp)
Error **errp)
{ {
int ret = 0; int ret = 0;
uint64_t image_size = (uint64_t) 2 * GiB; uint64_t image_size = (uint64_t) 2 * GiB;
@ -1737,24 +1736,15 @@ static int vhdx_create(const char *filename, QEMUOptionParameter *options,
gunichar2 *creator = NULL; gunichar2 *creator = NULL;
glong creator_items; glong creator_items;
BlockDriverState *bs; BlockDriverState *bs;
const char *type = NULL; char *type = NULL;
VHDXImageType image_type; VHDXImageType image_type;
Error *local_err = NULL; Error *local_err = NULL;
while (options && options->name) { image_size = qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0);
if (!strcmp(options->name, BLOCK_OPT_SIZE)) { log_size = qemu_opt_get_size_del(opts, VHDX_BLOCK_OPT_LOG_SIZE, 0);
image_size = options->value.n; block_size = qemu_opt_get_size_del(opts, VHDX_BLOCK_OPT_BLOCK_SIZE, 0);
} else if (!strcmp(options->name, VHDX_BLOCK_OPT_LOG_SIZE)) { type = qemu_opt_get_del(opts, BLOCK_OPT_SUBFMT);
log_size = options->value.n; use_zero_blocks = qemu_opt_get_bool_del(opts, VHDX_BLOCK_OPT_ZERO, false);
} else if (!strcmp(options->name, VHDX_BLOCK_OPT_BLOCK_SIZE)) {
block_size = options->value.n;
} else if (!strcmp(options->name, BLOCK_OPT_SUBFMT)) {
type = options->value.s;
} else if (!strcmp(options->name, VHDX_BLOCK_OPT_ZERO)) {
use_zero_blocks = options->value.n != 0;
}
options++;
}
if (image_size > VHDX_MAX_IMAGE_SIZE) { if (image_size > VHDX_MAX_IMAGE_SIZE) {
error_setg_errno(errp, EINVAL, "Image size too large; max of 64TB"); error_setg_errno(errp, EINVAL, "Image size too large; max of 64TB");
@ -1763,7 +1753,7 @@ static int vhdx_create(const char *filename, QEMUOptionParameter *options,
} }
if (type == NULL) { if (type == NULL) {
type = "dynamic"; type = g_strdup("dynamic");
} }
if (!strcmp(type, "dynamic")) { if (!strcmp(type, "dynamic")) {
@ -1803,7 +1793,7 @@ static int vhdx_create(const char *filename, QEMUOptionParameter *options,
block_size = block_size > VHDX_BLOCK_SIZE_MAX ? VHDX_BLOCK_SIZE_MAX : block_size = block_size > VHDX_BLOCK_SIZE_MAX ? VHDX_BLOCK_SIZE_MAX :
block_size; block_size;
ret = bdrv_create_file(filename, options, NULL, &local_err); ret = bdrv_create_file(filename, NULL, opts, &local_err);
if (ret < 0) { if (ret < 0) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
goto exit; goto exit;
@ -1863,6 +1853,7 @@ static int vhdx_create(const char *filename, QEMUOptionParameter *options,
delete_and_exit: delete_and_exit:
bdrv_unref(bs); bdrv_unref(bs);
exit: exit:
g_free(type);
g_free(creator); g_free(creator);
return ret; return ret;
} }
@ -1885,37 +1876,41 @@ static int vhdx_check(BlockDriverState *bs, BdrvCheckResult *result,
return 0; return 0;
} }
static QEMUOptionParameter vhdx_create_options[] = { static QemuOptsList vhdx_create_opts = {
{ .name = "vhdx-create-opts",
.name = BLOCK_OPT_SIZE, .head = QTAILQ_HEAD_INITIALIZER(vhdx_create_opts.head),
.type = OPT_SIZE, .desc = {
.help = "Virtual disk size; max of 64TB." {
}, .name = BLOCK_OPT_SIZE,
{ .type = QEMU_OPT_SIZE,
.name = VHDX_BLOCK_OPT_LOG_SIZE, .help = "Virtual disk size; max of 64TB."
.type = OPT_SIZE, },
.value.n = 1 * MiB, {
.help = "Log size; min 1MB." .name = VHDX_BLOCK_OPT_LOG_SIZE,
}, .type = QEMU_OPT_SIZE,
{ .def_value_str = stringify(DEFAULT_LOG_SIZE),
.name = VHDX_BLOCK_OPT_BLOCK_SIZE, .help = "Log size; min 1MB."
.type = OPT_SIZE, },
.value.n = 0, {
.help = "Block Size; min 1MB, max 256MB. " \ .name = VHDX_BLOCK_OPT_BLOCK_SIZE,
"0 means auto-calculate based on image size." .type = QEMU_OPT_SIZE,
}, .def_value_str = stringify(0),
{ .help = "Block Size; min 1MB, max 256MB. " \
.name = BLOCK_OPT_SUBFMT, "0 means auto-calculate based on image size."
.type = OPT_STRING, },
.help = "VHDX format type, can be either 'dynamic' or 'fixed'. "\ {
"Default is 'dynamic'." .name = BLOCK_OPT_SUBFMT,
}, .type = QEMU_OPT_STRING,
{ .help = "VHDX format type, can be either 'dynamic' or 'fixed'. "\
.name = VHDX_BLOCK_OPT_ZERO, "Default is 'dynamic'."
.type = OPT_FLAG, },
.help = "Force use of payload blocks of type 'ZERO'. Non-standard." {
}, .name = VHDX_BLOCK_OPT_ZERO,
{ NULL } .type = QEMU_OPT_BOOL,
.help = "Force use of payload blocks of type 'ZERO'. Non-standard."
},
{ NULL }
}
}; };
static BlockDriver bdrv_vhdx = { static BlockDriver bdrv_vhdx = {
@ -1927,11 +1922,11 @@ static BlockDriver bdrv_vhdx = {
.bdrv_reopen_prepare = vhdx_reopen_prepare, .bdrv_reopen_prepare = vhdx_reopen_prepare,
.bdrv_co_readv = vhdx_co_readv, .bdrv_co_readv = vhdx_co_readv,
.bdrv_co_writev = vhdx_co_writev, .bdrv_co_writev = vhdx_co_writev,
.bdrv_create = vhdx_create, .bdrv_create2 = vhdx_create,
.bdrv_get_info = vhdx_get_info, .bdrv_get_info = vhdx_get_info,
.bdrv_check = vhdx_check, .bdrv_check = vhdx_check,
.create_options = vhdx_create_options, .create_opts = &vhdx_create_opts,
}; };
static void bdrv_vhdx_init(void) static void bdrv_vhdx_init(void)

View File

@ -23,6 +23,7 @@
#define GiB (MiB * 1024) #define GiB (MiB * 1024)
#define TiB ((uint64_t) GiB * 1024) #define TiB ((uint64_t) GiB * 1024)
#define DEFAULT_LOG_SIZE 1048576 /* 1MiB */
/* Structures and fields present in the VHDX file */ /* Structures and fields present in the VHDX file */
/* The header section has the following blocks, /* The header section has the following blocks,