From 24b667eeed78d2df0376a38a592ed9d8c2744bdc Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Wed, 22 Nov 2023 14:32:48 +0100 Subject: [PATCH] qemu: block: Absorb logic from qemuBlockReopenFormat to qemuBlockReopenAccess MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move all the logic into the new function and remove the old one. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_block.c | 70 ++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 44 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 6cc5f891c5..3d311b3fa0 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -3191,45 +3191,6 @@ qemuBlockReopenFormatMon(qemuMonitor *mon, } -/** - * qemuBlockReopenFormat: - * @vm: domain object - * @src: storage source to reopen - * @asyncJob: qemu async job type - * - * Invokes the 'blockdev-reopen' command on the format layer of @src. This means - * that @src must be already properly configured for the desired outcome. The - * nodenames of @src are used to identify the specific image in qemu. - */ -static int -qemuBlockReopenFormat(virDomainObj *vm, - virStorageSource *src, - virDomainAsyncJob asyncJob) -{ - qemuDomainObjPrivate *priv = vm->privateData; - int rc; - - /* If we are lacking the object here, qemu might have opened an image with - * a node name unknown to us */ - if (!src->backingStore) { - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", - _("can't reopen image with unknown presence of backing store")); - return -1; - } - - if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) - return -1; - - rc = qemuBlockReopenFormatMon(priv->mon, src); - - qemuDomainObjExitMonitor(vm); - if (rc < 0) - return -1; - - return 0; -} - - /** * qemuBlockReopenAccess: * @vm: domain object @@ -3242,23 +3203,44 @@ qemuBlockReopenFormat(virDomainObj *vm, * * Callers must use qemuBlockReopenReadWrite/qemuBlockReopenReadOnly functions. */ - static int qemuBlockReopenAccess(virDomainObj *vm, virStorageSource *src, bool readonly, virDomainAsyncJob asyncJob) { + qemuDomainObjPrivate *priv = vm->privateData; + int rc; + int ret = -1; + if (src->readonly == readonly) return 0; - src->readonly = readonly; - if (qemuBlockReopenFormat(vm, src, asyncJob) < 0) { - src->readonly = !readonly; + /* If we are lacking the object here, qemu might have opened an image with + * a node name unknown to us */ + if (!src->backingStore) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("can't reopen image with unknown presence of backing store")); return -1; } - return 0; + src->readonly = readonly; + /* from now on all error paths must use 'goto cleanup' */ + + if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) + goto cleanup; + + rc = qemuBlockReopenFormatMon(priv->mon, src); + + qemuDomainObjExitMonitor(vm); + if (rc < 0) + goto cleanup; + + ret = 0; + + cleanup: + src->readonly = !readonly; + return ret; }