From nobody Sun Sep 20 21:48:44 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1784624999; cv=none; d=zohomail.com; s=zohoarc; b=TjzE3yTutZTgERLQP7ORRNYblSonzGNsgknoK46s2UipOIjCVVstZhk2cwN5ppt4SlD3D+/vzLawe3oWHeX55EMQ3wFb64/HLMo4y+anw7yQMGtJ4AX+AeEXFDbT2/JOs3OfS8au3dP+bTarpCmAupy+7+rnEyMkgLzFnJVGZsA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784624999; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id; bh=S5C80fg6wR6q8fD3UUaaBYxayjVxHIZ9z7Rs1NeLDIs=; b=WioDCyct+B5NDl4knSxy+pM7VFEo9HgDhBsAd/GgSURXsiJGG3eZLwO6IPNWetlsS4cwiwcreM8Sh4t7sDUM7OLyjGPpDIPV+PJ0dzR4rkNARILmvuu/R5qG6jitQ7NizhPfKMeLKVE/chkCsTycHDssItEhj1nn0saZDj3wlEM= ARC-Authentication-Results: i=1; mx.zohomail.com; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1784624999169177.83676224105636; Tue, 21 Jul 2026 02:09:59 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 09F9F4195A; Tue, 21 Jul 2026 05:09:57 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 031053F93E; Tue, 21 Jul 2026 05:07:45 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 6365541A69; Mon, 20 Jul 2026 03:13:41 -0400 (EDT) Received: from oss.nttdata.com (oss.nttdata.com [49.212.34.109]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 1AEDE419FD for ; Mon, 20 Jul 2026 03:13:34 -0400 (EDT) Received: by oss.nttdata.com (Postfix, from userid 1024) id 98CD82020241; Mon, 20 Jul 2026 16:06:23 +0900 (JST) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=5.0 tests=BAYES_00,MAILING_LIST_MULTI, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 To: devel@lists.libvirt.org Subject: [PATCH 2/2] qemu: Don't prepare an empty disk source on media change Date: Mon, 20 Jul 2026 16:06:24 +0900 Message-ID: <20260720070624.2503482-3-Mitsuru.Kariya@oss.nttdata.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260720070624.2503482-1-Mitsuru.Kariya@oss.nttdata.com> References: <20260720070624.2503482-1-Mitsuru.Kariya@oss.nttdata.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Virus-Scanned: clamav-milter 1.4.3 at oss.nttdata.com X-Virus-Status: Clean X-MailFrom: kariyam@oss.nttdata.com X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation Message-ID-Hash: R4RMENTPM5DPBCC3ONKHTAVSRJRNTCON X-Message-ID-Hash: R4RMENTPM5DPBCC3ONKHTAVSRJRNTCON X-Mailman-Approved-At: Tue, 21 Jul 2026 09:07:30 +0000 CC: Mitsuru Kariya X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Mitsuru Kariya via Devel Reply-To: Mitsuru Kariya X-ZM-MESSAGEID: 1784625001899158500 Content-Type: text/plain; charset="utf-8" qemuDomainChangeEjectableMedia() ran qemuDomainPrepareDiskSource() and the surrounding image setup (backing chain detection, storage access, managed PR) unconditionally. When ejecting to no media the new source is empty, and qemuDomainPrepareDiskSource() still assigned it node names that are never realized in QEMU, leaving a stale name in the disk source that a later detach would then try to blockdev-del. Wrap the image setup in a virStorageSourceIsEmpty() check, mirroring qemuDomainAttachDeviceDiskLiveInternal(), and only revoke storage access on rollback when it was actually granted, using a releaseSeclabel flag as the attach path already does. Signed-off-by: Mitsuru Kariya Reviewed-by: Peter Krempa --- src/qemu/qemu_hotplug.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index c2cd5496e0..b96ff24cbf 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -612,6 +612,7 @@ qemuDomainChangeEjectableMedia(virQEMUDriver *driver, qemuDomainObjPrivate *priv =3D vm->privateData; virStorageSource *oldsrc =3D disk->src; qemuDomainDiskPrivate *diskPriv =3D QEMU_DOMAIN_DISK_PRIVATE(disk); + bool releaseSeclabel =3D false; int rc; =20 if (diskPriv->blockjob && qemuBlockJobIsRunning(diskPriv->blockjob)) { @@ -625,17 +626,21 @@ qemuDomainChangeEjectableMedia(virQEMUDriver *driver, if (virDomainDiskTranslateSourcePool(disk) < 0) goto rollback; =20 - if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL) < 0) - goto rollback; + if (!virStorageSourceIsEmpty(newsrc)) { + if (qemuDomainDetermineDiskChain(driver, vm, disk, NULL) < 0) + goto rollback; =20 - if (qemuDomainPrepareDiskSource(disk, priv, cfg) < 0) - goto rollback; + if (qemuDomainPrepareDiskSource(disk, priv, cfg) < 0) + goto rollback; =20 - if (qemuDomainStorageSourceChainAccessAllow(driver, vm, newsrc) < 0) - goto rollback; + if (qemuDomainStorageSourceChainAccessAllow(driver, vm, newsrc) < = 0) + goto rollback; =20 - if (qemuHotplugAttachManagedPR(vm, newsrc, VIR_ASYNC_JOB_NONE) < 0) - goto rollback; + releaseSeclabel =3D true; + + if (qemuHotplugAttachManagedPR(vm, newsrc, VIR_ASYNC_JOB_NONE) < 0) + goto rollback; + } =20 rc =3D qemuDomainChangeMediaBlockdev(vm, disk, oldsrc, newsrc, force); =20 @@ -653,7 +658,8 @@ qemuDomainChangeEjectableMedia(virQEMUDriver *driver, return 0; =20 rollback: - ignore_value(qemuDomainStorageSourceChainAccessRevoke(driver, vm, news= rc)); + if (releaseSeclabel) + ignore_value(qemuDomainStorageSourceChainAccessRevoke(driver, vm, = newsrc)); =20 qemuHotplugRemoveManagedPR(vm, newsrc, VIR_ASYNC_JOB_NONE); =20 --=20 2.43.0