[PATCH] qemu_driver.c: Fix domfsinfo for non-PCI device information from guest agent

Daniel P. Berrangé berrange at redhat.com
Mon Jul 20 10:32:50 UTC 2020


On Mon, Jul 20, 2020 at 12:22:33PM +0200, Thomas Huth wrote:
> qemuAgentFSInfoToPublic() currently only sets the devAlias for PCI devices.
> However, the QEMU guest agent could also provide the device name in the
> "dev" field of the response for other devices instead (well, at least after
> fixing another problem in the current QEMU guest agent...). So if creating
> the devAlias from the PCI information failed, let's fall back to the name
> provided by the guest agent. This helps to fix the empty "Target" fields
> that occur when running "virsh domfsinfo" on s390x where CCW devices are
> used for the guest instead of PCI devices.
> 
> Also add a proper debug message here in case we completely failed to set the
> device alias, since this problem here was very hard to debug: The only two
> error messages that I've seen were "Unable to get filesystem information"
> and "Unable to encode message payload" - which only indicates that something
> went wrong in the RPC call. No debug message indicated the real problem, so
> I had to learn the hard way why the RPC call failed (it apparently does not
> like devAlias left to be NULL) and where the real problem comes from.
> 
> Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1755075
> Signed-off-by: Thomas Huth <thuth at redhat.com>
> ---
>  src/qemu/qemu_driver.c | 19 +++++++++++--------
>  1 file changed, 11 insertions(+), 8 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index d185666ed8..e45c61ee20 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -21935,14 +21935,17 @@ qemuAgentFSInfoToPublic(qemuAgentFSInfoPtr agent,
>          qemuAgentDiskInfoPtr agentdisk = agent->disks[i];
>          virDomainDiskDefPtr diskDef;
>  
> -        if (!(diskDef = virDomainDiskByAddress(vmdef,
> -                                               &agentdisk->pci_controller,
> -                                               agentdisk->bus,
> -                                               agentdisk->target,
> -                                               agentdisk->unit)))
> -            continue;
> -
> -        ret->devAlias[i] = g_strdup(diskDef->dst);
> +        diskDef = virDomainDiskByAddress(vmdef,
> +                                         &agentdisk->pci_controller,
> +                                         agentdisk->bus,
> +                                         agentdisk->target,
> +                                         agentdisk->unit);

Hmmm, even on x86 I think the original code is broken, or at least fragile.
The libvirt "bus" number is not guaranteed to match the guest kernel PCI
"bus" number. I wonder if this has been validated for complex PCI-Express
topologies.

> +        if (diskDef != NULL)
> +            ret->devAlias[i] = g_strdup(diskDef->dst);
> +        else if (agentdisk->devnode != NULL)
> +            ret->devAlias[i] = g_strdup(agentdisk->devnode);

In the linked BZ the "devnode" field is not provided either. You mention
a related QEMU patch, which I guess fixes that issue in QEMU ? Can you point
to that fix.

> +        else
> +            VIR_DEBUG("Missing devnode name for '%s'.", ret->mountpoint);
>      }

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




More information about the libvir-list mailing list