Skip to content

Commit

Permalink
block: Add options QDict to bdrv_open_common()
Browse files Browse the repository at this point in the history
The options are passed down to the block drivers, which are supposed to
remove all options they have processed. Anything that is left over in
the end is an unknown option and results in an error.

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
kevmw authored and stefanhaRH committed Mar 15, 2013
1 parent b382bc9 commit b6ad491
Showing 1 changed file with 26 additions and 6 deletions.
32 changes: 26 additions & 6 deletions block.c
Expand Up @@ -665,15 +665,18 @@ static int bdrv_open_flags(BlockDriverState *bs, int flags)

/*
* Common part for opening disk images and files
*
* Removes all processed options from *options.
*/
static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
const char *filename,
const char *filename, QDict *options,
int flags, BlockDriver *drv)
{
int ret, open_flags;

assert(drv != NULL);
assert(bs->file == NULL);
assert(options == NULL || bs->options != options);

trace_bdrv_open_common(bs, filename, flags, drv->format_name);

Expand Down Expand Up @@ -710,7 +713,7 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
} else {
assert(file != NULL);
bs->file = file;
ret = drv->bdrv_open(bs, NULL, open_flags);
ret = drv->bdrv_open(bs, options, open_flags);
}

if (ret < 0) {
Expand Down Expand Up @@ -752,7 +755,7 @@ int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags)
}

bs = bdrv_new("");
ret = bdrv_open_common(bs, NULL, filename, flags, drv);
ret = bdrv_open_common(bs, NULL, filename, NULL, flags, drv);
if (ret < 0) {
bdrv_delete(bs);
return ret;
Expand Down Expand Up @@ -821,6 +824,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
}

bs->options = options;
options = qdict_clone_shallow(options);

/* For snapshot=on, create a temporary qcow2 overlay */
if (flags & BDRV_O_SNAPSHOT) {
Expand Down Expand Up @@ -903,7 +907,7 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
}

/* Open the image */
ret = bdrv_open_common(bs, file, filename, flags, drv);
ret = bdrv_open_common(bs, file, filename, options, flags, drv);
if (ret < 0) {
goto unlink_and_fail;
}
Expand All @@ -917,11 +921,22 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
if ((flags & BDRV_O_NO_BACKING) == 0) {
ret = bdrv_open_backing_file(bs);
if (ret < 0) {
bdrv_close(bs);
return ret;
goto close_and_fail;
}
}

/* Check if any unknown options were used */
if (qdict_size(options) != 0) {
const QDictEntry *entry = qdict_first(options);
qerror_report(ERROR_CLASS_GENERIC_ERROR, "Block format '%s' used by "
"device '%s' doesn't support the option '%s'",
drv->format_name, bs->device_name, entry->key);

ret = -EINVAL;
goto close_and_fail;
}
QDECREF(options);

if (!bdrv_key_required(bs)) {
bdrv_dev_change_media_cb(bs, true);
}
Expand All @@ -942,8 +957,13 @@ int bdrv_open(BlockDriverState *bs, const char *filename, QDict *options,
}
fail:
QDECREF(bs->options);
QDECREF(options);
bs->options = NULL;
return ret;

close_and_fail:
bdrv_close(bs);
QDECREF(options);
return ret;
}

Expand Down

0 comments on commit b6ad491

Please sign in to comment.