Commit 83d0521a authored by Chunyan Liu's avatar Chunyan Liu Committed by Stefan Hajnoczi

change block layer to support both QemuOpts and QEMUOptionParamter

Change block layer to support both QemuOpts and QEMUOptionParameter.
After this patch, it will change backend drivers one by one. At the end,
QEMUOptionParameter will be removed and only QemuOpts is kept.
Signed-off-by: default avatarDong Xu Wang <wdongxu@linux.vnet.ibm.com>
Signed-off-by: default avatarChunyan Liu <cyliu@suse.com>
Reviewed-by: default avatarEric Blake <eblake@redhat.com>
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent 4782183d
This diff is collapsed.
......@@ -345,7 +345,7 @@ static int cow_create(const char *filename, QEMUOptionParameter *options,
options++;
}
ret = bdrv_create_file(filename, options, &local_err);
ret = bdrv_create_file(filename, options, NULL, &local_err);
if (ret < 0) {
error_propagate(errp, local_err);
return ret;
......
......@@ -718,7 +718,7 @@ static int qcow_create(const char *filename, QEMUOptionParameter *options,
options++;
}
ret = bdrv_create_file(filename, options, &local_err);
ret = bdrv_create_file(filename, options, NULL, &local_err);
if (ret < 0) {
error_propagate(errp, local_err);
return ret;
......
......@@ -1626,7 +1626,7 @@ static int qcow2_create2(const char *filename, int64_t total_size,
Error *local_err = NULL;
int ret;
ret = bdrv_create_file(filename, options, &local_err);
ret = bdrv_create_file(filename, options, NULL, &local_err);
if (ret < 0) {
error_propagate(errp, local_err);
return ret;
......
......@@ -586,7 +586,7 @@ static int qed_create(const char *filename, uint32_t cluster_size,
int ret = 0;
BlockDriverState *bs;
ret = bdrv_create_file(filename, NULL, &local_err);
ret = bdrv_create_file(filename, NULL, NULL, &local_err);
if (ret < 0) {
error_propagate(errp, local_err);
return ret;
......
......@@ -145,7 +145,7 @@ static int raw_create(const char *filename, QEMUOptionParameter *options,
Error *local_err = NULL;
int ret;
ret = bdrv_create_file(filename, options, &local_err);
ret = bdrv_create_file(filename, options, NULL, &local_err);
if (local_err) {
error_propagate(errp, local_err);
}
......
......@@ -1803,7 +1803,7 @@ static int vhdx_create(const char *filename, QEMUOptionParameter *options,
block_size = block_size > VHDX_BLOCK_SIZE_MAX ? VHDX_BLOCK_SIZE_MAX :
block_size;
ret = bdrv_create_file(filename, options, &local_err);
ret = bdrv_create_file(filename, options, NULL, &local_err);
if (ret < 0) {
error_propagate(errp, local_err);
goto exit;
......
......@@ -1539,7 +1539,7 @@ static int vmdk_create_extent(const char *filename, int64_t filesize,
uint32_t *gd_buf = NULL;
int gd_buf_size;
ret = bdrv_create_file(filename, NULL, &local_err);
ret = bdrv_create_file(filename, NULL, NULL, &local_err);
if (ret < 0) {
error_propagate(errp, local_err);
goto exit;
......@@ -1879,7 +1879,7 @@ static int vmdk_create(const char *filename, QEMUOptionParameter *options,
if (!split && !flat) {
desc_offset = 0x200;
} else {
ret = bdrv_create_file(filename, options, &local_err);
ret = bdrv_create_file(filename, options, NULL, &local_err);
if (ret < 0) {
error_propagate(errp, local_err);
goto exit;
......
......@@ -2930,7 +2930,7 @@ static int enable_write_target(BDRVVVFATState *s, Error **errp)
set_option_parameter_int(options, BLOCK_OPT_SIZE, s->sector_count * 512);
set_option_parameter(options, BLOCK_OPT_BACKING_FILE, "fat:");
ret = bdrv_create(bdrv_qcow, s->qcow_filename, options, errp);
ret = bdrv_create(bdrv_qcow, s->qcow_filename, options, NULL, errp);
free_option_parameters(options);
if (ret < 0) {
goto err;
......
......@@ -204,9 +204,9 @@ BlockDriver *bdrv_find_format(const char *format_name);
BlockDriver *bdrv_find_whitelisted_format(const char *format_name,
bool readonly);
int bdrv_create(BlockDriver *drv, const char* filename,
QEMUOptionParameter *options, Error **errp);
QEMUOptionParameter *options, QemuOpts *opts, Error **errp);
int bdrv_create_file(const char* filename, QEMUOptionParameter *options,
Error **errp);
QemuOpts *opts, Error **errp);
BlockDriverState *bdrv_new(const char *device_name, Error **errp);
void bdrv_make_anon(BlockDriverState *bs);
void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old);
......@@ -312,7 +312,8 @@ typedef enum {
int bdrv_check(BlockDriverState *bs, BdrvCheckResult *res, BdrvCheckMode fix);
int bdrv_amend_options(BlockDriverState *bs_new, QEMUOptionParameter *options);
int bdrv_amend_options(BlockDriverState *bs_new, QEMUOptionParameter *options,
QemuOpts *opts);
/* external snapshots */
bool bdrv_recurse_is_first_non_filter(BlockDriverState *bs,
......
......@@ -118,6 +118,8 @@ struct BlockDriver {
void (*bdrv_rebind)(BlockDriverState *bs);
int (*bdrv_create)(const char *filename, QEMUOptionParameter *options,
Error **errp);
/* FIXME: will remove the duplicate and rename back to bdrv_create later */
int (*bdrv_create2)(const char *filename, QemuOpts *opts, Error **errp);
int (*bdrv_set_key)(BlockDriverState *bs, const char *key);
int (*bdrv_make_empty)(BlockDriverState *bs);
/* aio */
......@@ -217,7 +219,12 @@ struct BlockDriver {
/* List of options for creating images, terminated by name == NULL */
QEMUOptionParameter *create_options;
/* FIXME: will replace create_options.
* These two fields are mutually exclusive. At most one is non-NULL.
* create_options should only be set with bdrv_create, and create_opts
* should only be set with bdrv_create2.
*/
QemuOptsList *create_opts;
/*
* Returns 0 for completed check, -errno for internal errors.
......@@ -228,6 +235,10 @@ struct BlockDriver {
int (*bdrv_amend_options)(BlockDriverState *bs,
QEMUOptionParameter *options);
/* FIXME: will remove the duplicate and rename back to
* bdrv_amend_options later
*/
int (*bdrv_amend_options2)(BlockDriverState *bs, QemuOpts *opts);
void (*bdrv_debug_event)(BlockDriverState *bs, BlkDebugEvent event);
......
......@@ -271,7 +271,7 @@ static int read_password(char *buf, int buf_size)
static int print_block_option_help(const char *filename, const char *fmt)
{
BlockDriver *drv, *proto_drv;
QEMUOptionParameter *create_options = NULL;
QemuOptsList *create_opts = NULL;
/* Find driver and parse its options */
drv = bdrv_find_format(fmt);
......@@ -280,22 +280,21 @@ static int print_block_option_help(const char *filename, const char *fmt)
return 1;
}
create_options = append_option_parameters(create_options,
drv->create_options);
create_opts = qemu_opts_append(create_opts, drv->create_opts,
drv->create_options);
if (filename) {
proto_drv = bdrv_find_protocol(filename, true);
if (!proto_drv) {
error_report("Unknown protocol '%s'", filename);
free_option_parameters(create_options);
qemu_opts_free(create_opts);
return 1;
}
create_options = append_option_parameters(create_options,
proto_drv->create_options);
create_opts = qemu_opts_append(create_opts, proto_drv->create_opts,
proto_drv->create_options);
}
print_option_help(create_options);
free_option_parameters(create_options);
qemu_opts_print_help(create_opts);
qemu_opts_free(create_opts);
return 0;
}
......@@ -349,19 +348,19 @@ fail:
return NULL;
}
static int add_old_style_options(const char *fmt, QEMUOptionParameter *list,
static int add_old_style_options(const char *fmt, QemuOpts *opts,
const char *base_filename,
const char *base_fmt)
{
if (base_filename) {
if (set_option_parameter(list, BLOCK_OPT_BACKING_FILE, base_filename)) {
if (qemu_opt_set(opts, BLOCK_OPT_BACKING_FILE, base_filename)) {
error_report("Backing file not supported for file format '%s'",
fmt);
return -1;
}
}
if (base_fmt) {
if (set_option_parameter(list, BLOCK_OPT_BACKING_FMT, base_fmt)) {
if (qemu_opt_set(opts, BLOCK_OPT_BACKING_FMT, base_fmt)) {
error_report("Backing file format not supported for file "
"format '%s'", fmt);
return -1;
......@@ -1191,8 +1190,9 @@ static int img_convert(int argc, char **argv)
size_t bufsectors = IO_BUF_SIZE / BDRV_SECTOR_SIZE;
const uint8_t *buf1;
BlockDriverInfo bdi;
QEMUOptionParameter *param = NULL, *create_options = NULL;
QEMUOptionParameter *out_baseimg_param;
QemuOpts *opts = NULL;
QemuOptsList *create_opts = NULL;
const char *out_baseimg_param;
char *options = NULL;
const char *snapshot_name = NULL;
int min_sparse = 8; /* Need at least 4k of zeros for sparse detection */
......@@ -1381,40 +1381,36 @@ static int img_convert(int argc, char **argv)
goto out;
}
create_options = append_option_parameters(create_options,
drv->create_options);
create_options = append_option_parameters(create_options,
proto_drv->create_options);
create_opts = qemu_opts_append(create_opts, drv->create_opts,
drv->create_options);
create_opts = qemu_opts_append(create_opts, proto_drv->create_opts,
proto_drv->create_options);
if (options) {
param = parse_option_parameters(options, create_options, param);
if (param == NULL) {
error_report("Invalid options for file format '%s'.", out_fmt);
ret = -1;
goto out;
}
} else {
param = parse_option_parameters("", create_options, param);
opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
if (options && qemu_opts_do_parse(opts, options, NULL)) {
error_report("Invalid options for file format '%s'", out_fmt);
ret = -1;
goto out;
}
set_option_parameter_int(param, BLOCK_OPT_SIZE, total_sectors * 512);
ret = add_old_style_options(out_fmt, param, out_baseimg, NULL);
qemu_opt_set_number(opts, BLOCK_OPT_SIZE, total_sectors * 512);
ret = add_old_style_options(out_fmt, opts, out_baseimg, NULL);
if (ret < 0) {
goto out;
}
/* Get backing file name if -o backing_file was used */
out_baseimg_param = get_option_parameter(param, BLOCK_OPT_BACKING_FILE);
out_baseimg_param = qemu_opt_get(opts, BLOCK_OPT_BACKING_FILE);
if (out_baseimg_param) {
out_baseimg = out_baseimg_param->value.s;
out_baseimg = out_baseimg_param;
}
/* Check if compression is supported */
if (compress) {
QEMUOptionParameter *encryption =
get_option_parameter(param, BLOCK_OPT_ENCRYPT);
QEMUOptionParameter *preallocation =
get_option_parameter(param, BLOCK_OPT_PREALLOC);
bool encryption =
qemu_opt_get_bool(opts, BLOCK_OPT_ENCRYPT, false);
const char *preallocation =
qemu_opt_get(opts, BLOCK_OPT_PREALLOC);
if (!drv->bdrv_write_compressed) {
error_report("Compression not supported for this file format");
......@@ -1422,15 +1418,15 @@ static int img_convert(int argc, char **argv)
goto out;
}
if (encryption && encryption->value.n) {
if (encryption) {
error_report("Compression and encryption not supported at "
"the same time");
ret = -1;
goto out;
}
if (preallocation && preallocation->value.s
&& strcmp(preallocation->value.s, "off"))
if (preallocation
&& strcmp(preallocation, "off"))
{
error_report("Compression and preallocation not supported at "
"the same time");
......@@ -1441,7 +1437,7 @@ static int img_convert(int argc, char **argv)
if (!skip_create) {
/* Create the new image */
ret = bdrv_create(drv, out_filename, param, &local_err);
ret = bdrv_create(drv, out_filename, NULL, opts, &local_err);
if (ret < 0) {
error_report("%s: error while converting %s: %s",
out_filename, out_fmt, error_get_pretty(local_err));
......@@ -1706,8 +1702,8 @@ out:
qemu_progress_print(100, 0);
}
qemu_progress_end();
free_option_parameters(create_options);
free_option_parameters(param);
qemu_opts_del(opts);
qemu_opts_free(create_opts);
qemu_vfree(buf);
if (sn_opts) {
qemu_opts_del(sn_opts);
......@@ -2698,7 +2694,8 @@ static int img_amend(int argc, char **argv)
{
int c, ret = 0;
char *options = NULL;
QEMUOptionParameter *create_options = NULL, *options_param = NULL;
QemuOptsList *create_opts = NULL;
QemuOpts *opts = NULL;
const char *fmt = NULL, *filename;
bool quiet = false;
BlockDriverState *bs = NULL;
......@@ -2769,17 +2766,16 @@ static int img_amend(int argc, char **argv)
goto out;
}
create_options = append_option_parameters(create_options,
bs->drv->create_options);
options_param = parse_option_parameters(options, create_options,
options_param);
if (options_param == NULL) {
create_opts = qemu_opts_append(create_opts, bs->drv->create_opts,
bs->drv->create_options);
opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
if (options && qemu_opts_do_parse(opts, options, NULL)) {
error_report("Invalid options for file format '%s'", fmt);
ret = -1;
goto out;
}
ret = bdrv_amend_options(bs, options_param);
ret = bdrv_amend_options(bs, NULL, opts);
if (ret < 0) {
error_report("Error while amending options: %s", strerror(-ret));
goto out;
......@@ -2789,8 +2785,8 @@ out:
if (bs) {
bdrv_unref(bs);
}
free_option_parameters(create_options);
free_option_parameters(options_param);
qemu_opts_del(opts);
qemu_opts_free(create_opts);
g_free(options);
if (ret) {
......
......@@ -120,7 +120,7 @@ qemu-img: kilobytes, megabytes, gigabytes, terabytes, petabytes and exabytes.
qemu-img create -f qcow2 -o size=foobar TEST_DIR/t.qcow2
qemu-img: Parameter 'size' expects a size
qemu-img: TEST_DIR/t.qcow2: Invalid options for file format 'qcow2'.
qemu-img: TEST_DIR/t.qcow2: Invalid options for file format 'qcow2'
== Check correct interpretation of suffixes for cluster size ==
......
......@@ -281,7 +281,7 @@ Lazy refcounts only supported with compatibility level 1.1 and above (use compat
qemu-img: Error while amending options: Invalid argument
Unknown compatibility level 0.42.
qemu-img: Error while amending options: Invalid argument
Unknown option 'foo'
qemu-img: Invalid parameter 'foo'
qemu-img: Invalid options for file format 'qcow2'
Changing the cluster size is not supported.
qemu-img: Error while amending options: Operation not supported
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment