While fixing domfsinfo for non-PCI (i.e. CCW) devices on s390x,
I accidentally used the whole device path for the devAlias field.
However, it should only contain the base target name.
Currently we have the wrong output:
$ virsh domfsinfo guestname
Mountpoint Name Type Target
---------------------------------------
/ sda3 xfs /dev/sda3
/boot sda1 xfs /dev/sda1
It should look like this instead:
$ virsh domfsinfo guestname
Mountpoint Name Type Target
------------------------------------
/ sda3 xfs sda
/boot sda1 xfs sda
Thus we have to strip the "/dev/" prefix and the partition number
from the string.
Fixes: f8333b3b0a ("qemu: Fix domfsinfo for non-PCI device information ...")
Buglink:
https://bugzilla.redhat.com/show_bug.cgi?id=1858771
Reported-by: Sebastian Mitterle <smitterl(a)redhat.com>
---
src/qemu/qemu_driver.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 05f8eb2cb7..d92bee1d35 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -18874,6 +18874,30 @@ qemuDomainGetFSInfoAgent(virQEMUDriverPtr driver,
return ret;
}
+/* Turn device node string like "/dev/vda1" into a target name like
"vda" */
+static char *
+qemuAgentDevNodeToTarget(const char *devnode)
+{
+ char *str = g_strdup(devnode);
+ size_t len = strlen(str);
+
+ /* Remove the "/dev/" prefix from the string */
+ if (g_str_has_prefix(str, "/dev/")) {
+ len -= 5;
+ memmove(str, str + 5, len + 1);
+ }
+
+ /* Remove the partition number from the end of the string */
+ while (len > 0) {
+ len--;
+ if (!g_ascii_isdigit(str[len]))
+ break;
+ str[len] = 0;
+ }
+
+ return str;
+}
+
static virDomainFSInfoPtr
qemuAgentFSInfoToPublic(qemuAgentFSInfoPtr agent,
virDomainDefPtr vmdef)
@@ -18903,7 +18927,7 @@ qemuAgentFSInfoToPublic(qemuAgentFSInfoPtr agent,
if (diskDef != NULL)
ret->devAlias[i] = g_strdup(diskDef->dst);
else if (agentdisk->devnode != NULL)
- ret->devAlias[i] = g_strdup(agentdisk->devnode);
+ ret->devAlias[i] = qemuAgentDevNodeToTarget(agentdisk->devnode);
else
VIR_DEBUG("Missing devnode name for '%s'.",
ret->mountpoint);
}
--
2.18.4