[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 20/25] block/export: Add option to allow export of inactive nodes
From: |
Kevin Wolf |
Subject: |
[PULL 20/25] block/export: Add option to allow export of inactive nodes |
Date: |
Mon, 10 Feb 2025 17:10:29 +0100 |
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>
Message-ID: <20250204211407.381505-13-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@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
- [PULL 04/25] block: Fix leak in send_qmp_error_event, (continued)
- [PULL 04/25] block: Fix leak in send_qmp_error_event, Kevin Wolf, 2025/02/10
- [PULL 11/25] block: Inactivate external snapshot overlays when necessary, Kevin Wolf, 2025/02/10
- [PULL 10/25] block: Allow inactivating already inactive nodes, Kevin Wolf, 2025/02/10
- [PULL 08/25] block-backend: Fix argument order when calling 'qapi_event_send_block_io_error()', Kevin Wolf, 2025/02/10
- [PULL 09/25] block: Add 'active' field to BlockDeviceInfo, Kevin Wolf, 2025/02/10
- [PULL 07/25] scripts/qemu-gdb: Support coroutine dumps in coredumps, Kevin Wolf, 2025/02/10
- [PULL 12/25] migration/block-active: Remove global active flag, Kevin Wolf, 2025/02/10
- [PULL 13/25] block: Don't attach inactive child to active node, Kevin Wolf, 2025/02/10
- [PULL 14/25] block: Fix crash on block_resize on inactive node, Kevin Wolf, 2025/02/10
- [PULL 18/25] block/export: Don't ignore image activation error in blk_exp_add(), Kevin Wolf, 2025/02/10
- [PULL 20/25] block/export: Add option to allow export of inactive nodes,
Kevin Wolf <=
- [PULL 17/25] block: Support inactive nodes in blk_insert_bs(), Kevin Wolf, 2025/02/10
- [PULL 21/25] nbd/server: Support inactive nodes, Kevin Wolf, 2025/02/10
- [PULL 25/25] block: remove unused BLOCK_OP_TYPE_DATAPLANE, Kevin Wolf, 2025/02/10
- [PULL 16/25] block: Add blockdev-set-active QMP command, Kevin Wolf, 2025/02/10
- [PULL 19/25] block: Drain nodes before inactivating them, Kevin Wolf, 2025/02/10
- [PULL 15/25] block: Add option to create inactive nodes, Kevin Wolf, 2025/02/10
- [PULL 22/25] iotests: Add filter_qtest(), Kevin Wolf, 2025/02/10
- [PULL 23/25] iotests: Add qsd-migrate case, Kevin Wolf, 2025/02/10
- [PULL 24/25] iotests: Add (NBD-based) tests for inactive nodes, Kevin Wolf, 2025/02/10
- Re: [PULL 00/25] Block layer patches, Stefan Hajnoczi, 2025/02/10