On Mon, Jul 20, 2026 at 16:06:23 +0900, Mitsuru Kariya via Devel wrote:
> qemuDomainRemoveDiskDevice() called
> qemuBlockStorageSourceChainDetachPrepareBlockdev() unconditionally. A
> CD-ROM with no media has an empty source (path == NULL), for which

The condition for a source being empty is a bit more complex, because
NBD network devices can be full and have NULL path.


> virStorageSourceIsEmpty() returns true while virStorageSourceIsBacking()
> still returns true, so the chain walk prepared a blockdev-del for a node

Yeah, unfortunately due to historical reasons an empty drive is of type
_FILE and empty path.


> that was never created in QEMU. Detaching such a device produced an
> internal error, either
> "Failed to find node with node-name='libvirt-N-storage'" (when a prior
> eject had left a stale node name in the source) or
> "argument key 'node-name' must not have null value".
> 
> Guard the detach preparation with virStorageSourceIsEmpty(), as the
> old-media detach in qemuDomainChangeMediaBlockdev() already does. The
> following qemuBlockStorageSourceChainDetach() and access revoke are
> already guarded by a non-NULL diskBackend, so an empty source is left
> untouched.
> 
> Signed-off-by: Mitsuru Kariya <[email protected]>
> ---
>  src/qemu/qemu_hotplug.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 5be567b510..c2cd5496e0 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -4861,7 +4861,8 @@ qemuDomainRemoveDiskDevice(virQEMUDriver *driver,
>              diskPriv->blockjob->disk = NULL;
>              g_clear_pointer(&diskPriv->blockjob, virObjectUnref);
>          } else {
> -            if (!(diskBackend = 
> qemuBlockStorageSourceChainDetachPrepareBlockdev(disk->src)))
> +            if (!virStorageSourceIsEmpty(disk->src) &&
> +                !(diskBackend = 
> qemuBlockStorageSourceChainDetachPrepareBlockdev(disk->src)))
>                  goto cleanup;
>          }

I'll drop the node about path==NULL because the rest is explanatory
enough.

Reviewed-by: Peter Krempa <[email protected]>

Reply via email to