]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: domain: Fill in (i)SCSI backend nodename if it is not present in status XML
authorPeter Krempa <pkrempa@redhat.com>
Wed, 9 Sep 2020 15:58:34 +0000 (17:58 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 15 Sep 2020 13:20:23 +0000 (15:20 +0200)
For upgrade reasons so that we can modify the used nodename we must
generate the old version for all status XMLs which don't have it stored
explicitly.

The change will be required as using the user-provided alias may result
in too-long nodenames which will be rejected by qemu.

Add code which fills in the appropriate old value and add test cases to
validate that it's added and also that existing nodenames are not
overwritten.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_domain.c
tests/qemustatusxml2xmldata/modern-in.xml
tests/qemustatusxml2xmldata/upgrade-in.xml
tests/qemustatusxml2xmldata/upgrade-out.xml

index 03917cf0001db453395205d9905ef53ca76de0f3..3f7851a8ecf50d37759630904a4c7e3d70ac4a00 100644 (file)
@@ -5301,6 +5301,57 @@ qemuDomainDeviceHostdevDefPostParseRestoreSecAlias(virDomainHostdevDefPtr hostde
 }
 
 
+/**
+ * qemuDomainDeviceHostdevDefPostParseRestoreBackendAlias:
+ *
+ * Re-generate backend alias if it wasn't stored in the status XML by an older
+ * libvirtd.
+ *
+ * Note that qemuCaps should be always present for a status XML.
+ */
+static int
+qemuDomainDeviceHostdevDefPostParseRestoreBackendAlias(virDomainHostdevDefPtr hostdev,
+                                                       virQEMUCapsPtr qemuCaps,
+                                                       unsigned int parseFlags)
+{
+    virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
+    virStorageSourcePtr src;
+
+    if (!(parseFlags & VIR_DOMAIN_DEF_PARSE_STATUS))
+        return 0;
+
+    if (!qemuCaps ||
+        hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
+        hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI ||
+        !virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI))
+        return 0;
+
+    switch ((virDomainHostdevSCSIProtocolType) scsisrc->protocol) {
+    case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_NONE:
+        if (!scsisrc->u.host.src &&
+            !(scsisrc->u.host.src = virStorageSourceNew()))
+            return -1;
+
+        src = scsisrc->u.host.src;
+        break;
+
+    case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI:
+        src = scsisrc->u.iscsi.src;
+        break;
+
+    case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST:
+    default:
+        virReportEnumRangeError(virDomainHostdevSCSIProtocolType, scsisrc->protocol);
+        return -1;
+    }
+
+    if (!src->nodestorage)
+        src->nodestorage = g_strdup_printf("libvirt-%s-backend", hostdev->info->alias);
+
+    return 0;
+}
+
+
 static int
 qemuDomainHostdevDefMdevPostParse(virDomainHostdevSubsysMediatedDevPtr mdevsrc,
                                   virQEMUCapsPtr qemuCaps)
@@ -5327,6 +5378,10 @@ qemuDomainHostdevDefPostParse(virDomainHostdevDefPtr hostdev,
                                                            parseFlags) < 0)
         return -1;
 
+    if (qemuDomainDeviceHostdevDefPostParseRestoreBackendAlias(hostdev, qemuCaps,
+                                                               parseFlags) < 0)
+        return -1;
+
     if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
         hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV &&
         qemuDomainHostdevDefMdevPostParse(&subsys->u.mdev, qemuCaps) < 0)
index 0a3990bd3e69cb4b67325061066bb53a1033790b..5a5d5b89836bc307a312892ab224a1e80ba1ec96 100644 (file)
     <flag name='dump-completed'/>
     <flag name='hda-output'/>
     <flag name='blockdev'/>
+    <flag name='blockdev-hostdev-scsi'/>
   </qemuCaps>
   <devices>
     <device alias='rng0'/>
index 1942eacfa4c4fb678fd5ecca52e24ce067e04d9c..7fa56429f4212660da1e5e4d6f3b83b0187ec2c8 100644 (file)
     <flag name='isa-serial'/>
     <flag name='dump-completed'/>
     <flag name='hda-output'/>
+    <flag name='blockdev-hostdev-scsi'/>
   </qemuCaps>
   <devices>
     <device alias='rng0'/>
index ee3c1b49b0c4a111c623b9bffece899717880721..962d25ce2eebd80c59e61f7387d96ac4b8dde641 100644 (file)
     <flag name='isa-serial'/>
     <flag name='dump-completed'/>
     <flag name='hda-output'/>
+    <flag name='blockdev-hostdev-scsi'/>
   </qemuCaps>
   <devices>
     <device alias='rng0'/>
         <source protocol='iscsi' name='iqn.1992-01.com.example:storage/1'>
           <host name='example.org' port='3260'/>
           <privateData>
+            <nodenames>
+              <nodename type='storage' name='libvirt-hostdev0-backend'/>
+            </nodenames>
             <objects>
               <secret type='auth' alias='hostdev0-secret0'/>
             </objects>
         <source protocol='iscsi' name='iqn.1992-01.com.example:storage/2'>
           <host name='example.org' port='3260'/>
           <privateData>
+            <nodenames>
+              <nodename type='storage' name='libvirt-hostdev1-backend'/>
+            </nodenames>
             <objects>
               <secret type='auth' alias='hostdev1-secret0'/>
             </objects>
         <source>
           <adapter name='scsi_host0'/>
           <address bus='0' target='0' unit='0'/>
+          <privateData>
+            <nodenames>
+              <nodename type='storage' name='libvirt-hostdev2-backend'/>
+            </nodenames>
+          </privateData>
         </source>
         <alias name='hostdev2'/>
         <address type='drive' controller='0' bus='0' target='2' unit='6'/>