block: trickle down the fallback image creation function use to the block drivers
Instead of checking the .bdrv_co_create_opts to see if we need the fallback, just implement the .bdrv_co_create_opts in the drivers that need it. This way we don't break various places that need to know if the underlying protocol/format really supports image creation, and this way we still allow some drivers to not support image creation. Fixes: fd17146cd93d1704cd96d7c2757b325fc7aac6fd Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1816007 Note that technically this driver reverts the image creation fallback for the vxhs driver since I don't have a means to test it, and IMHO it is better to leave it not supported as it was prior to generic image creation patches. Also drop iscsi_create_opts which was left accidentally. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Message-Id: <20200326011218.29230-3-mlevitsk@redhat.com> Reviewed-by: Denis V. Lunev <den@openvz.org> [mreitz: Fixed alignment, and moved bdrv_co_create_opts_simple() and bdrv_create_opts_simple from block.h into block_int.h] Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
b92902dfea
commit
5a5e7f8cd8
35
block.c
35
block.c
@ -598,8 +598,15 @@ static int create_file_fallback_zero_first_sector(BlockBackend *blk,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bdrv_create_file_fallback(const char *filename, BlockDriver *drv,
|
/**
|
||||||
QemuOpts *opts, Error **errp)
|
* Simple implementation of bdrv_co_create_opts for protocol drivers
|
||||||
|
* which only support creation via opening a file
|
||||||
|
* (usually existing raw storage device)
|
||||||
|
*/
|
||||||
|
int coroutine_fn bdrv_co_create_opts_simple(BlockDriver *drv,
|
||||||
|
const char *filename,
|
||||||
|
QemuOpts *opts,
|
||||||
|
Error **errp)
|
||||||
{
|
{
|
||||||
BlockBackend *blk;
|
BlockBackend *blk;
|
||||||
QDict *options;
|
QDict *options;
|
||||||
@ -663,11 +670,7 @@ int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
|
|||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (drv->bdrv_co_create_opts) {
|
return bdrv_create(drv, filename, opts, errp);
|
||||||
return bdrv_create(drv, filename, opts, errp);
|
|
||||||
} else {
|
|
||||||
return bdrv_create_file_fallback(filename, drv, opts, errp);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int coroutine_fn bdrv_co_delete_file(BlockDriverState *bs, Error **errp)
|
int coroutine_fn bdrv_co_delete_file(BlockDriverState *bs, Error **errp)
|
||||||
@ -1592,9 +1595,9 @@ QemuOptsList bdrv_runtime_opts = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static QemuOptsList fallback_create_opts = {
|
QemuOptsList bdrv_create_opts_simple = {
|
||||||
.name = "fallback-create-opts",
|
.name = "simple-create-opts",
|
||||||
.head = QTAILQ_HEAD_INITIALIZER(fallback_create_opts.head),
|
.head = QTAILQ_HEAD_INITIALIZER(bdrv_create_opts_simple.head),
|
||||||
.desc = {
|
.desc = {
|
||||||
{
|
{
|
||||||
.name = BLOCK_OPT_SIZE,
|
.name = BLOCK_OPT_SIZE,
|
||||||
@ -5963,13 +5966,15 @@ void bdrv_img_create(const char *filename, const char *fmt,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!proto_drv->create_opts) {
|
||||||
|
error_setg(errp, "Protocol driver '%s' does not support image creation",
|
||||||
|
proto_drv->format_name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create parameter list */
|
/* Create parameter list */
|
||||||
create_opts = qemu_opts_append(create_opts, drv->create_opts);
|
create_opts = qemu_opts_append(create_opts, drv->create_opts);
|
||||||
if (proto_drv->create_opts) {
|
create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
|
||||||
create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
|
|
||||||
} else {
|
|
||||||
create_opts = qemu_opts_append(create_opts, &fallback_create_opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
|
opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
|
||||||
|
|
||||||
|
@ -3513,6 +3513,8 @@ static BlockDriver bdrv_host_device = {
|
|||||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||||
.bdrv_reopen_commit = raw_reopen_commit,
|
.bdrv_reopen_commit = raw_reopen_commit,
|
||||||
.bdrv_reopen_abort = raw_reopen_abort,
|
.bdrv_reopen_abort = raw_reopen_abort,
|
||||||
|
.bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||||
|
.create_opts = &bdrv_create_opts_simple,
|
||||||
.mutable_opts = mutable_opts,
|
.mutable_opts = mutable_opts,
|
||||||
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
||||||
.bdrv_co_pwrite_zeroes = hdev_co_pwrite_zeroes,
|
.bdrv_co_pwrite_zeroes = hdev_co_pwrite_zeroes,
|
||||||
@ -3639,10 +3641,11 @@ static BlockDriver bdrv_host_cdrom = {
|
|||||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||||
.bdrv_reopen_commit = raw_reopen_commit,
|
.bdrv_reopen_commit = raw_reopen_commit,
|
||||||
.bdrv_reopen_abort = raw_reopen_abort,
|
.bdrv_reopen_abort = raw_reopen_abort,
|
||||||
|
.bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||||
|
.create_opts = &bdrv_create_opts_simple,
|
||||||
.mutable_opts = mutable_opts,
|
.mutable_opts = mutable_opts,
|
||||||
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
||||||
|
|
||||||
|
|
||||||
.bdrv_co_preadv = raw_co_preadv,
|
.bdrv_co_preadv = raw_co_preadv,
|
||||||
.bdrv_co_pwritev = raw_co_pwritev,
|
.bdrv_co_pwritev = raw_co_pwritev,
|
||||||
.bdrv_co_flush_to_disk = raw_co_flush_to_disk,
|
.bdrv_co_flush_to_disk = raw_co_flush_to_disk,
|
||||||
@ -3771,6 +3774,8 @@ static BlockDriver bdrv_host_cdrom = {
|
|||||||
.bdrv_reopen_prepare = raw_reopen_prepare,
|
.bdrv_reopen_prepare = raw_reopen_prepare,
|
||||||
.bdrv_reopen_commit = raw_reopen_commit,
|
.bdrv_reopen_commit = raw_reopen_commit,
|
||||||
.bdrv_reopen_abort = raw_reopen_abort,
|
.bdrv_reopen_abort = raw_reopen_abort,
|
||||||
|
.bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||||
|
.create_opts = &bdrv_create_opts_simple,
|
||||||
.mutable_opts = mutable_opts,
|
.mutable_opts = mutable_opts,
|
||||||
|
|
||||||
.bdrv_co_preadv = raw_co_preadv,
|
.bdrv_co_preadv = raw_co_preadv,
|
||||||
|
@ -2399,18 +2399,6 @@ out_unlock:
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QemuOptsList iscsi_create_opts = {
|
|
||||||
.name = "iscsi-create-opts",
|
|
||||||
.head = QTAILQ_HEAD_INITIALIZER(iscsi_create_opts.head),
|
|
||||||
.desc = {
|
|
||||||
{
|
|
||||||
.name = BLOCK_OPT_SIZE,
|
|
||||||
.type = QEMU_OPT_SIZE,
|
|
||||||
.help = "Virtual disk size"
|
|
||||||
},
|
|
||||||
{ /* end of list */ }
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char *const iscsi_strong_runtime_opts[] = {
|
static const char *const iscsi_strong_runtime_opts[] = {
|
||||||
"transport",
|
"transport",
|
||||||
@ -2434,6 +2422,8 @@ static BlockDriver bdrv_iscsi = {
|
|||||||
.bdrv_parse_filename = iscsi_parse_filename,
|
.bdrv_parse_filename = iscsi_parse_filename,
|
||||||
.bdrv_file_open = iscsi_open,
|
.bdrv_file_open = iscsi_open,
|
||||||
.bdrv_close = iscsi_close,
|
.bdrv_close = iscsi_close,
|
||||||
|
.bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||||
|
.create_opts = &bdrv_create_opts_simple,
|
||||||
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
||||||
.bdrv_reopen_commit = iscsi_reopen_commit,
|
.bdrv_reopen_commit = iscsi_reopen_commit,
|
||||||
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
||||||
@ -2471,6 +2461,8 @@ static BlockDriver bdrv_iser = {
|
|||||||
.bdrv_parse_filename = iscsi_parse_filename,
|
.bdrv_parse_filename = iscsi_parse_filename,
|
||||||
.bdrv_file_open = iscsi_open,
|
.bdrv_file_open = iscsi_open,
|
||||||
.bdrv_close = iscsi_close,
|
.bdrv_close = iscsi_close,
|
||||||
|
.bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||||
|
.create_opts = &bdrv_create_opts_simple,
|
||||||
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
.bdrv_reopen_prepare = iscsi_reopen_prepare,
|
||||||
.bdrv_reopen_commit = iscsi_reopen_commit,
|
.bdrv_reopen_commit = iscsi_reopen_commit,
|
||||||
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
||||||
|
@ -2038,6 +2038,8 @@ static BlockDriver bdrv_nbd = {
|
|||||||
.protocol_name = "nbd",
|
.protocol_name = "nbd",
|
||||||
.instance_size = sizeof(BDRVNBDState),
|
.instance_size = sizeof(BDRVNBDState),
|
||||||
.bdrv_parse_filename = nbd_parse_filename,
|
.bdrv_parse_filename = nbd_parse_filename,
|
||||||
|
.bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||||
|
.create_opts = &bdrv_create_opts_simple,
|
||||||
.bdrv_file_open = nbd_open,
|
.bdrv_file_open = nbd_open,
|
||||||
.bdrv_reopen_prepare = nbd_client_reopen_prepare,
|
.bdrv_reopen_prepare = nbd_client_reopen_prepare,
|
||||||
.bdrv_co_preadv = nbd_client_co_preadv,
|
.bdrv_co_preadv = nbd_client_co_preadv,
|
||||||
@ -2063,6 +2065,8 @@ static BlockDriver bdrv_nbd_tcp = {
|
|||||||
.protocol_name = "nbd+tcp",
|
.protocol_name = "nbd+tcp",
|
||||||
.instance_size = sizeof(BDRVNBDState),
|
.instance_size = sizeof(BDRVNBDState),
|
||||||
.bdrv_parse_filename = nbd_parse_filename,
|
.bdrv_parse_filename = nbd_parse_filename,
|
||||||
|
.bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||||
|
.create_opts = &bdrv_create_opts_simple,
|
||||||
.bdrv_file_open = nbd_open,
|
.bdrv_file_open = nbd_open,
|
||||||
.bdrv_reopen_prepare = nbd_client_reopen_prepare,
|
.bdrv_reopen_prepare = nbd_client_reopen_prepare,
|
||||||
.bdrv_co_preadv = nbd_client_co_preadv,
|
.bdrv_co_preadv = nbd_client_co_preadv,
|
||||||
@ -2088,6 +2092,8 @@ static BlockDriver bdrv_nbd_unix = {
|
|||||||
.protocol_name = "nbd+unix",
|
.protocol_name = "nbd+unix",
|
||||||
.instance_size = sizeof(BDRVNBDState),
|
.instance_size = sizeof(BDRVNBDState),
|
||||||
.bdrv_parse_filename = nbd_parse_filename,
|
.bdrv_parse_filename = nbd_parse_filename,
|
||||||
|
.bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||||
|
.create_opts = &bdrv_create_opts_simple,
|
||||||
.bdrv_file_open = nbd_open,
|
.bdrv_file_open = nbd_open,
|
||||||
.bdrv_reopen_prepare = nbd_client_reopen_prepare,
|
.bdrv_reopen_prepare = nbd_client_reopen_prepare,
|
||||||
.bdrv_co_preadv = nbd_client_co_preadv,
|
.bdrv_co_preadv = nbd_client_co_preadv,
|
||||||
|
@ -1333,6 +1333,9 @@ static BlockDriver bdrv_nvme = {
|
|||||||
.protocol_name = "nvme",
|
.protocol_name = "nvme",
|
||||||
.instance_size = sizeof(BDRVNVMeState),
|
.instance_size = sizeof(BDRVNVMeState),
|
||||||
|
|
||||||
|
.bdrv_co_create_opts = bdrv_co_create_opts_simple,
|
||||||
|
.create_opts = &bdrv_create_opts_simple,
|
||||||
|
|
||||||
.bdrv_parse_filename = nvme_parse_filename,
|
.bdrv_parse_filename = nvme_parse_filename,
|
||||||
.bdrv_file_open = nvme_file_open,
|
.bdrv_file_open = nvme_file_open,
|
||||||
.bdrv_close = nvme_close,
|
.bdrv_close = nvme_close,
|
||||||
|
@ -283,6 +283,7 @@ BlockDriver *bdrv_find_format(const char *format_name);
|
|||||||
int bdrv_create(BlockDriver *drv, const char* filename,
|
int bdrv_create(BlockDriver *drv, const char* filename,
|
||||||
QemuOpts *opts, Error **errp);
|
QemuOpts *opts, Error **errp);
|
||||||
int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp);
|
int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp);
|
||||||
|
|
||||||
BlockDriverState *bdrv_new(void);
|
BlockDriverState *bdrv_new(void);
|
||||||
void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
|
void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
|
@ -1331,4 +1331,15 @@ int refresh_total_sectors(BlockDriverState *bs, int64_t hint);
|
|||||||
void bdrv_set_monitor_owned(BlockDriverState *bs);
|
void bdrv_set_monitor_owned(BlockDriverState *bs);
|
||||||
BlockDriverState *bds_tree_init(QDict *bs_opts, Error **errp);
|
BlockDriverState *bds_tree_init(QDict *bs_opts, Error **errp);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple implementation of bdrv_co_create_opts for protocol drivers
|
||||||
|
* which only support creation via opening a file
|
||||||
|
* (usually existing raw storage device)
|
||||||
|
*/
|
||||||
|
int coroutine_fn bdrv_co_create_opts_simple(BlockDriver *drv,
|
||||||
|
const char *filename,
|
||||||
|
QemuOpts *opts,
|
||||||
|
Error **errp);
|
||||||
|
extern QemuOptsList bdrv_create_opts_simple;
|
||||||
|
|
||||||
#endif /* BLOCK_INT_H */
|
#endif /* BLOCK_INT_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user