297 lines
12 KiB
Diff
297 lines
12 KiB
Diff
From a1f7b929ae1fe6fa424c520c3a5eb497333b0fd9 Mon Sep 17 00:00:00 2001
|
|
From: Maxim Levitsky <mlevitsk@redhat.com>
|
|
Date: Thu, 26 Mar 2020 20:23:07 +0000
|
|
Subject: [PATCH 2/4] block: trickle down the fallback image creation function
|
|
use to the block drivers
|
|
|
|
RH-Author: Maxim Levitsky <mlevitsk@redhat.com>
|
|
Message-id: <20200326202307.9264-3-mlevitsk@redhat.com>
|
|
Patchwork-id: 94446
|
|
O-Subject: [RHEL-AV-8.2.0 qemu-kvm PATCH 2/2] block: trickle down the fallback image creation function use to the block drivers
|
|
Bugzilla: 1816007
|
|
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
|
|
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
|
RH-Acked-by: Max Reitz <mreitz@redhat.com>
|
|
|
|
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>
|
|
(cherry picked from commit 5a5e7f8cd86b7ced0732b1b6e28c82baa65b09c9)
|
|
|
|
Contextual conflicts in block.c and include/block/block_int.h
|
|
|
|
(conflict in block.c by default shows as functional but
|
|
with --diff-algorithm=patience it becomes a contextual conflict)
|
|
|
|
...
|
|
001/2:[----] [--] 'block: pass BlockDriver reference to the .bdrv_co_create'
|
|
002/2:[0014] [FC] 'block: trickle down the fallback image creation function use to the block drivers'
|
|
...
|
|
002/2: 'meld <(git show 5a5e7f8^\!) <(git show 6d3bca5^\!)'
|
|
|
|
So now running:
|
|
meld <(git show 5a5e7f8^\! --diff-algorithm=patience) <(git show 6d3bca5^\! --diff-algorithm=patience)
|
|
|
|
shows no contextual conflicts
|
|
It is mostly due to missing commit f6dc1c31d3801dcbdf0c56574f9ff4f05180810c
|
|
Thanks to Max Reitz for helping me with this.
|
|
|
|
Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
block.c | 35 ++++++++++++++++++++---------------
|
|
block/file-posix.c | 7 ++++++-
|
|
block/iscsi.c | 16 ++++------------
|
|
block/nbd.c | 6 ++++++
|
|
block/nvme.c | 3 +++
|
|
include/block/block.h | 1 +
|
|
include/block/block_int.h | 11 +++++++++++
|
|
7 files changed, 51 insertions(+), 28 deletions(-)
|
|
|
|
diff --git a/block.c b/block.c
|
|
index f9a1c5b..ba3b40d7 100644
|
|
--- a/block.c
|
|
+++ b/block.c
|
|
@@ -597,8 +597,15 @@ static int create_file_fallback_zero_first_sector(BlockBackend *blk,
|
|
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;
|
|
QDict *options;
|
|
@@ -662,11 +669,7 @@ int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp)
|
|
return -ENOENT;
|
|
}
|
|
|
|
- if (drv->bdrv_co_create_opts) {
|
|
- return bdrv_create(drv, filename, opts, errp);
|
|
- } else {
|
|
- return bdrv_create_file_fallback(filename, drv, opts, errp);
|
|
- }
|
|
+ return bdrv_create(drv, filename, opts, errp);
|
|
}
|
|
|
|
/**
|
|
@@ -1543,9 +1546,9 @@ QemuOptsList bdrv_runtime_opts = {
|
|
},
|
|
};
|
|
|
|
-static QemuOptsList fallback_create_opts = {
|
|
- .name = "fallback-create-opts",
|
|
- .head = QTAILQ_HEAD_INITIALIZER(fallback_create_opts.head),
|
|
+QemuOptsList bdrv_create_opts_simple = {
|
|
+ .name = "simple-create-opts",
|
|
+ .head = QTAILQ_HEAD_INITIALIZER(bdrv_create_opts_simple.head),
|
|
.desc = {
|
|
{
|
|
.name = BLOCK_OPT_SIZE,
|
|
@@ -5910,13 +5913,15 @@ void bdrv_img_create(const char *filename, const char *fmt,
|
|
return;
|
|
}
|
|
|
|
- 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);
|
|
- } else {
|
|
- create_opts = qemu_opts_append(create_opts, &fallback_create_opts);
|
|
+ if (!proto_drv->create_opts) {
|
|
+ error_setg(errp, "Protocol driver '%s' does not support image creation",
|
|
+ proto_drv->format_name);
|
|
+ return;
|
|
}
|
|
|
|
+ create_opts = qemu_opts_append(create_opts, drv->create_opts);
|
|
+ create_opts = qemu_opts_append(create_opts, proto_drv->create_opts);
|
|
+
|
|
/* Create parameter list with default values */
|
|
opts = qemu_opts_create(create_opts, NULL, 0, &error_abort);
|
|
qemu_opt_set_number(opts, BLOCK_OPT_SIZE, img_size, &error_abort);
|
|
diff --git a/block/file-posix.c b/block/file-posix.c
|
|
index a2e0a74..dd18d40 100644
|
|
--- a/block/file-posix.c
|
|
+++ b/block/file-posix.c
|
|
@@ -3432,6 +3432,8 @@ static BlockDriver bdrv_host_device = {
|
|
.bdrv_reopen_prepare = raw_reopen_prepare,
|
|
.bdrv_reopen_commit = raw_reopen_commit,
|
|
.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,
|
|
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
|
.bdrv_co_pwrite_zeroes = hdev_co_pwrite_zeroes,
|
|
@@ -3558,10 +3560,11 @@ static BlockDriver bdrv_host_cdrom = {
|
|
.bdrv_reopen_prepare = raw_reopen_prepare,
|
|
.bdrv_reopen_commit = raw_reopen_commit,
|
|
.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,
|
|
.bdrv_co_invalidate_cache = raw_co_invalidate_cache,
|
|
|
|
-
|
|
.bdrv_co_preadv = raw_co_preadv,
|
|
.bdrv_co_pwritev = raw_co_pwritev,
|
|
.bdrv_co_flush_to_disk = raw_co_flush_to_disk,
|
|
@@ -3690,6 +3693,8 @@ static BlockDriver bdrv_host_cdrom = {
|
|
.bdrv_reopen_prepare = raw_reopen_prepare,
|
|
.bdrv_reopen_commit = raw_reopen_commit,
|
|
.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,
|
|
|
|
.bdrv_co_preadv = raw_co_preadv,
|
|
diff --git a/block/iscsi.c b/block/iscsi.c
|
|
index b45da65..16b0716 100644
|
|
--- a/block/iscsi.c
|
|
+++ b/block/iscsi.c
|
|
@@ -2399,18 +2399,6 @@ out_unlock:
|
|
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[] = {
|
|
"transport",
|
|
@@ -2434,6 +2422,8 @@ static BlockDriver bdrv_iscsi = {
|
|
.bdrv_parse_filename = iscsi_parse_filename,
|
|
.bdrv_file_open = iscsi_open,
|
|
.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_commit = iscsi_reopen_commit,
|
|
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
|
@@ -2471,6 +2461,8 @@ static BlockDriver bdrv_iser = {
|
|
.bdrv_parse_filename = iscsi_parse_filename,
|
|
.bdrv_file_open = iscsi_open,
|
|
.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_commit = iscsi_reopen_commit,
|
|
.bdrv_co_invalidate_cache = iscsi_co_invalidate_cache,
|
|
diff --git a/block/nbd.c b/block/nbd.c
|
|
index a73f0d9..927915d 100644
|
|
--- a/block/nbd.c
|
|
+++ b/block/nbd.c
|
|
@@ -2030,6 +2030,8 @@ static BlockDriver bdrv_nbd = {
|
|
.protocol_name = "nbd",
|
|
.instance_size = sizeof(BDRVNBDState),
|
|
.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_reopen_prepare = nbd_client_reopen_prepare,
|
|
.bdrv_co_preadv = nbd_client_co_preadv,
|
|
@@ -2055,6 +2057,8 @@ static BlockDriver bdrv_nbd_tcp = {
|
|
.protocol_name = "nbd+tcp",
|
|
.instance_size = sizeof(BDRVNBDState),
|
|
.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_reopen_prepare = nbd_client_reopen_prepare,
|
|
.bdrv_co_preadv = nbd_client_co_preadv,
|
|
@@ -2080,6 +2084,8 @@ static BlockDriver bdrv_nbd_unix = {
|
|
.protocol_name = "nbd+unix",
|
|
.instance_size = sizeof(BDRVNBDState),
|
|
.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_reopen_prepare = nbd_client_reopen_prepare,
|
|
.bdrv_co_preadv = nbd_client_co_preadv,
|
|
diff --git a/block/nvme.c b/block/nvme.c
|
|
index d41c4bd..7b7c0cc 100644
|
|
--- a/block/nvme.c
|
|
+++ b/block/nvme.c
|
|
@@ -1333,6 +1333,9 @@ static BlockDriver bdrv_nvme = {
|
|
.protocol_name = "nvme",
|
|
.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_file_open = nvme_file_open,
|
|
.bdrv_close = nvme_close,
|
|
diff --git a/include/block/block.h b/include/block/block.h
|
|
index 1df9848..92685d2 100644
|
|
--- a/include/block/block.h
|
|
+++ b/include/block/block.h
|
|
@@ -293,6 +293,7 @@ BlockDriver *bdrv_find_format(const char *format_name);
|
|
int bdrv_create(BlockDriver *drv, const char* filename,
|
|
QemuOpts *opts, Error **errp);
|
|
int bdrv_create_file(const char *filename, QemuOpts *opts, Error **errp);
|
|
+
|
|
BlockDriverState *bdrv_new(void);
|
|
void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top,
|
|
Error **errp);
|
|
diff --git a/include/block/block_int.h b/include/block/block_int.h
|
|
index 7ff81be..529f153 100644
|
|
--- a/include/block/block_int.h
|
|
+++ b/include/block/block_int.h
|
|
@@ -1325,4 +1325,15 @@ int coroutine_fn bdrv_co_copy_range_to(BdrvChild *src, uint64_t src_offset,
|
|
|
|
int refresh_total_sectors(BlockDriverState *bs, int64_t hint);
|
|
|
|
+/**
|
|
+ * 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 */
|
|
--
|
|
1.8.3.1
|
|
|