mirror of https://gitee.com/openkylin/qemu.git
block: Add bdrv_new_open_driver()
This function allows to create more or less normal BlockDriverStates even for BlockDrivers that aren't globally registered (e.g. helper filters for block jobs). Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
01a5650179
commit
680c7f9606
30
block.c
30
block.c
|
@ -939,13 +939,16 @@ static int bdrv_open_driver(BlockDriverState *bs, BlockDriver *drv,
|
||||||
}
|
}
|
||||||
|
|
||||||
bs->drv = drv;
|
bs->drv = drv;
|
||||||
|
bs->read_only = !(bs->open_flags & BDRV_O_RDWR);
|
||||||
bs->opaque = g_malloc0(drv->instance_size);
|
bs->opaque = g_malloc0(drv->instance_size);
|
||||||
|
|
||||||
if (drv->bdrv_file_open) {
|
if (drv->bdrv_file_open) {
|
||||||
assert(!drv->bdrv_needs_filename || bs->filename[0]);
|
assert(!drv->bdrv_needs_filename || bs->filename[0]);
|
||||||
ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
|
ret = drv->bdrv_file_open(bs, options, open_flags, &local_err);
|
||||||
} else {
|
} else if (drv->bdrv_open) {
|
||||||
ret = drv->bdrv_open(bs, options, open_flags, &local_err);
|
ret = drv->bdrv_open(bs, options, open_flags, &local_err);
|
||||||
|
} else {
|
||||||
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
@ -986,6 +989,31 @@ free_and_fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_name,
|
||||||
|
int flags, Error **errp)
|
||||||
|
{
|
||||||
|
BlockDriverState *bs;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
bs = bdrv_new();
|
||||||
|
bs->open_flags = flags;
|
||||||
|
bs->explicit_options = qdict_new();
|
||||||
|
bs->options = qdict_new();
|
||||||
|
bs->opaque = NULL;
|
||||||
|
|
||||||
|
update_options_from_flags(bs->options, flags);
|
||||||
|
|
||||||
|
ret = bdrv_open_driver(bs, drv, node_name, bs->options, flags, errp);
|
||||||
|
if (ret < 0) {
|
||||||
|
QDECREF(bs->explicit_options);
|
||||||
|
QDECREF(bs->options);
|
||||||
|
bdrv_unref(bs);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bs;
|
||||||
|
}
|
||||||
|
|
||||||
QemuOptsList bdrv_runtime_opts = {
|
QemuOptsList bdrv_runtime_opts = {
|
||||||
.name = "bdrv_common",
|
.name = "bdrv_common",
|
||||||
.head = QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head),
|
.head = QTAILQ_HEAD_INITIALIZER(bdrv_runtime_opts.head),
|
||||||
|
|
|
@ -215,6 +215,8 @@ int bdrv_open_backing_file(BlockDriverState *bs, QDict *parent_options,
|
||||||
const char *bdref_key, Error **errp);
|
const char *bdref_key, Error **errp);
|
||||||
BlockDriverState *bdrv_open(const char *filename, const char *reference,
|
BlockDriverState *bdrv_open(const char *filename, const char *reference,
|
||||||
QDict *options, int flags, Error **errp);
|
QDict *options, int flags, Error **errp);
|
||||||
|
BlockDriverState *bdrv_new_open_driver(BlockDriver *drv, const char *node_name,
|
||||||
|
int flags, Error **errp);
|
||||||
BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
|
BlockReopenQueue *bdrv_reopen_queue(BlockReopenQueue *bs_queue,
|
||||||
BlockDriverState *bs,
|
BlockDriverState *bs,
|
||||||
QDict *options, int flags);
|
QDict *options, int flags);
|
||||||
|
|
Loading…
Reference in New Issue