From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, hreitz@redhat.com, stefanha@redhat.com,
pkrempa@redhat.com, peterx@redhat.com, farosas@suse.de,
qemu-devel@nongnu.org
Subject: [PATCH v3 12/16] block/export: Add option to allow export of inactive nodes
Date: Tue, 4 Feb 2025 22:14:03 +0100 [thread overview]
Message-ID: <20250204211407.381505-13-kwolf@redhat.com> (raw)
In-Reply-To: <20250204211407.381505-1-kwolf@redhat.com>
Add an option in BlockExportOptions to allow creating an export on an
inactive node without activating the node. This mode needs to be
explicitly supported by the export type (so that it doesn't perform any
operations that are forbidden for inactive nodes), so this patch alone
doesn't allow this option to be successfully used yet.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Acked-by: Fabiano Rosas <farosas@suse.de>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
qapi/block-export.json | 10 +++++++++-
include/block/export.h | 3 +++
block/export/export.c | 31 +++++++++++++++++++++----------
3 files changed, 33 insertions(+), 11 deletions(-)
diff --git a/qapi/block-export.json b/qapi/block-export.json
index ce33fe378d..117b05d13c 100644
--- a/qapi/block-export.json
+++ b/qapi/block-export.json
@@ -372,6 +372,13 @@
# cannot be moved to the iothread. The default is false.
# (since: 5.2)
#
+# @allow-inactive: If true, the export allows the exported node to be inactive.
+# If it is created for an inactive block node, the node remains inactive. If
+# the export type doesn't support running on an inactive node, an error is
+# returned. If false, inactive block nodes are automatically activated before
+# creating the export and trying to inactivate them later fails.
+# (since: 10.0; default: false)
+#
# Since: 4.2
##
{ 'union': 'BlockExportOptions',
@@ -381,7 +388,8 @@
'*iothread': 'str',
'node-name': 'str',
'*writable': 'bool',
- '*writethrough': 'bool' },
+ '*writethrough': 'bool',
+ '*allow-inactive': 'bool' },
'discriminator': 'type',
'data': {
'nbd': 'BlockExportOptionsNbd',
diff --git a/include/block/export.h b/include/block/export.h
index f2fe0f8078..4bd9531d4d 100644
--- a/include/block/export.h
+++ b/include/block/export.h
@@ -29,6 +29,9 @@ typedef struct BlockExportDriver {
*/
size_t instance_size;
+ /* True if the export type supports running on an inactive node */
+ bool supports_inactive;
+
/* Creates and starts a new block export */
int (*create)(BlockExport *, BlockExportOptions *, Error **);
diff --git a/block/export/export.c b/block/export/export.c
index bac42b8608..f3bbf11070 100644
--- a/block/export/export.c
+++ b/block/export/export.c
@@ -75,6 +75,7 @@ static const BlockExportDriver *blk_exp_find_driver(BlockExportType type)
BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
{
bool fixed_iothread = export->has_fixed_iothread && export->fixed_iothread;
+ bool allow_inactive = export->has_allow_inactive && export->allow_inactive;
const BlockExportDriver *drv;
BlockExport *exp = NULL;
BlockDriverState *bs;
@@ -138,17 +139,24 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
}
}
- /*
- * Block exports are used for non-shared storage migration. Make sure
- * that BDRV_O_INACTIVE is cleared and the image is ready for write
- * access since the export could be available before migration handover.
- * ctx was acquired in the caller.
- */
bdrv_graph_rdlock_main_loop();
- ret = bdrv_activate(bs, errp);
- if (ret < 0) {
- bdrv_graph_rdunlock_main_loop();
- goto fail;
+ if (allow_inactive) {
+ if (!drv->supports_inactive) {
+ error_setg(errp, "Export type does not support inactive exports");
+ bdrv_graph_rdunlock_main_loop();
+ goto fail;
+ }
+ } else {
+ /*
+ * Block exports are used for non-shared storage migration. Make sure
+ * that BDRV_O_INACTIVE is cleared and the image is ready for write
+ * access since the export could be available before migration handover.
+ */
+ ret = bdrv_activate(bs, errp);
+ if (ret < 0) {
+ bdrv_graph_rdunlock_main_loop();
+ goto fail;
+ }
}
bdrv_graph_rdunlock_main_loop();
@@ -162,6 +170,9 @@ BlockExport *blk_exp_add(BlockExportOptions *export, Error **errp)
if (!fixed_iothread) {
blk_set_allow_aio_context_change(blk, true);
}
+ if (allow_inactive) {
+ blk_set_force_allow_inactivate(blk);
+ }
ret = blk_insert_bs(blk, bs, errp);
if (ret < 0) {
--
2.48.1
next prev parent reply other threads:[~2025-02-04 21:19 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-04 21:13 [PATCH v3 00/16] block: Managing inactive nodes (QSD migration) Kevin Wolf
2025-02-04 21:13 ` [PATCH v3 01/16] block: Add 'active' field to BlockDeviceInfo Kevin Wolf
2025-02-04 21:13 ` [PATCH v3 02/16] block: Allow inactivating already inactive nodes Kevin Wolf
2025-02-04 21:13 ` [PATCH v3 03/16] block: Inactivate external snapshot overlays when necessary Kevin Wolf
2025-02-04 21:13 ` [PATCH v3 04/16] migration/block-active: Remove global active flag Kevin Wolf
2025-02-04 21:13 ` [PATCH v3 05/16] block: Don't attach inactive child to active node Kevin Wolf
2025-02-04 21:13 ` [PATCH v3 06/16] block: Fix crash on block_resize on inactive node Kevin Wolf
2025-02-04 21:13 ` [PATCH v3 07/16] block: Add option to create inactive nodes Kevin Wolf
2025-02-04 21:13 ` [PATCH v3 08/16] block: Add blockdev-set-active QMP command Kevin Wolf
2025-02-04 21:14 ` [PATCH v3 09/16] block: Support inactive nodes in blk_insert_bs() Kevin Wolf
2025-02-04 21:14 ` [PATCH v3 10/16] block/export: Don't ignore image activation error in blk_exp_add() Kevin Wolf
2025-02-04 21:14 ` [PATCH v3 11/16] block: Drain nodes before inactivating them Kevin Wolf
2025-02-05 20:42 ` Eric Blake
2025-02-04 21:14 ` Kevin Wolf [this message]
2025-02-04 21:14 ` [PATCH v3 13/16] nbd/server: Support inactive nodes Kevin Wolf
2025-02-05 20:43 ` Eric Blake
2025-02-04 21:14 ` [PATCH v3 14/16] iotests: Add filter_qtest() Kevin Wolf
2025-02-04 21:14 ` [PATCH v3 15/16] iotests: Add qsd-migrate case Kevin Wolf
2025-02-05 20:46 ` Eric Blake
2025-02-24 10:23 ` Thomas Huth
2025-02-24 13:13 ` Kevin Wolf
2025-02-04 21:14 ` [PATCH v3 16/16] iotests: Add (NBD-based) tests for inactive nodes Kevin Wolf
2025-02-05 20:49 ` Eric Blake
2025-02-05 15:35 ` [PATCH v3 00/16] block: Managing inactive nodes (QSD migration) Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250204211407.381505-13-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=farosas@suse.de \
--cc=hreitz@redhat.com \
--cc=peterx@redhat.com \
--cc=pkrempa@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).