]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Store SCSI bus length in virDomainDef
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 3 Aug 2021 09:00:48 +0000 (11:00 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 16 Aug 2021 12:22:38 +0000 (14:22 +0200)
Libvirt assumes that a SCSI bus can fit up to 8 devices
(including controller itself), except for so called wide bus
which can accommodate up to 16 devices (again, including
controller). This plays important role when computing 'drive'
address in virDomainDiskDefAssignAddress(). So far, the only
driver that enables wide SCSI bus is VMX. But with newer
releases, ESX is capable of "super wide" bus (64 devices).

We can blindly bump the limit in our code because then we would
compute address that's invalid for older ESX versions that we
still want to support.

Unfortunately, I haven't found a better place where to store this
than virDomainDef.

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
18 files changed:
src/bhyve/bhyve_parse_command.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/hyperv/hyperv_driver.c
src/libxl/libxl_driver.c
src/libxl/xen_xl.c
src/libxl/xen_xm.c
src/lxc/lxc_native.c
src/openvz/openvz_conf.c
src/qemu/qemu_process.c
src/vbox/vbox_common.c
src/vmx/vmx.c
src/vz/vz_sdk.c
tests/genericxml2xmltest.c
tests/openvzutilstest.c
tests/qemublocktest.c
tests/qemumonitortestutils.c
tests/securityselinuxtest.c

index 04fd88872c9472bdbb7309f369916f52b3d91ab1..76dcea6f21ef3bb62e91f90582d5a877d6f5d2d7 100644 (file)
@@ -948,7 +948,7 @@ bhyveParseCommandLineString(const char* nativeConfig,
     int loader_argc = 0;
     char **loader_argv = NULL;
 
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(xmlopt)))
         goto cleanup;
 
     /* Initialize defaults. */
index e8b0f00ad6284938e8091bcbe30ff3d80e596ece..e9bdbbfd7426175ad98a217040fd1049d1dc9c1e 100644 (file)
@@ -3801,7 +3801,7 @@ virDomainObjNew(virDomainXMLOption *xmlopt)
 
 
 virDomainDef *
-virDomainDefNew(void)
+virDomainDefNew(virDomainXMLOption *xmlopt)
 {
     virDomainDef *ret;
 
@@ -3814,6 +3814,11 @@ virDomainDefNew(void)
     ret->mem.soft_limit = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED;
     ret->mem.swap_hard_limit = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED;
 
+    if (xmlopt && xmlopt->config.features & VIR_DOMAIN_DEF_FEATURE_WIDE_SCSI)
+        ret->scsiBusMaxUnit = SCSI_WIDE_BUS_MAX_CONT_UNIT;
+    else
+        ret->scsiBusMaxUnit = SCSI_NARROW_BUS_MAX_CONT_UNIT;
+
     return ret;
 
  error:
@@ -5138,12 +5143,11 @@ virDomainSCSIDriveAddressIsUsed(const virDomainDef *def,
 /* Find out the next usable "unit" of a specific controller */
 static int
 virDomainControllerSCSINextUnit(const virDomainDef *def,
-                                unsigned int max_unit,
                                 unsigned int controller)
 {
     size_t i;
 
-    for (i = 0; i < max_unit; i++) {
+    for (i = 0; i < def->scsiBusMaxUnit; i++) {
         /* Default to assigning addresses using bus = target = 0 */
         const virDomainDeviceDriveAddress addr = {controller, 0, 0, i};
 
@@ -5155,22 +5159,13 @@ virDomainControllerSCSINextUnit(const virDomainDef *def,
 }
 
 
-#define SCSI_WIDE_BUS_MAX_CONT_UNIT 16
-#define SCSI_NARROW_BUS_MAX_CONT_UNIT 7
-
 static void
-virDomainHostdevAssignAddress(virDomainXMLOption *xmlopt,
+virDomainHostdevAssignAddress(virDomainXMLOption *xmlopt G_GNUC_UNUSED,
                               const virDomainDef *def,
                               virDomainHostdevDef *hostdev)
 {
     int next_unit = 0;
     int controller = 0;
-    unsigned int max_unit;
-
-    if (xmlopt->config.features & VIR_DOMAIN_DEF_FEATURE_WIDE_SCSI)
-        max_unit = SCSI_WIDE_BUS_MAX_CONT_UNIT;
-    else
-        max_unit = SCSI_NARROW_BUS_MAX_CONT_UNIT;
 
     /* NB: Do not attempt calling virDomainDefMaybeAddController to
      * automagically add a "new" controller. Doing so will result in
@@ -5185,7 +5180,7 @@ virDomainHostdevAssignAddress(virDomainXMLOption *xmlopt,
      * hostdev being added to the as yet to be created controller.
      */
     do {
-        next_unit = virDomainControllerSCSINextUnit(def, max_unit, controller);
+        next_unit = virDomainControllerSCSINextUnit(def, controller);
         if (next_unit < 0)
             controller++;
     } while (next_unit < 0);
@@ -7657,7 +7652,7 @@ virDomainDeviceFindSCSIController(const virDomainDef *def,
 }
 
 int
-virDomainDiskDefAssignAddress(virDomainXMLOption *xmlopt,
+virDomainDiskDefAssignAddress(virDomainXMLOption *xmlopt G_GNUC_UNUSED,
                               virDomainDiskDef *def,
                               const virDomainDef *vmdef)
 {
@@ -7677,14 +7672,14 @@ virDomainDiskDefAssignAddress(virDomainXMLOption *xmlopt,
 
         def->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE;
 
-        if (xmlopt->config.features & VIR_DOMAIN_DEF_FEATURE_WIDE_SCSI) {
+        if (vmdef->scsiBusMaxUnit > SCSI_NARROW_BUS_MAX_CONT_UNIT) {
             /* For a wide SCSI bus we define the default mapping to be
              * 16 units per bus, 1 bus per controller, many controllers.
              * Unit 7 is the SCSI controller itself. Therefore unit 7
              * cannot be assigned to disks and is skipped.
              */
-            controller = idx / 15;
-            unit = idx % 15;
+            controller = idx / (vmdef->scsiBusMaxUnit - 1);
+            unit = idx % (vmdef->scsiBusMaxUnit - 1);
 
             /* Skip the SCSI controller at unit 7 */
             if (unit >= 7)
@@ -19528,7 +19523,7 @@ virDomainDefParseXML(xmlXPathContextPtr ctxt,
     g_autofree xmlNodePtr *nodes = NULL;
     g_autofree char *tmp = NULL;
 
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(xmlopt)))
         return NULL;
 
     if (virDomainDefParseIDs(def, ctxt, flags, &uuid_generated) < 0)
index 984939cc69913548c9ff9b32ef29fdb23857577a..375299f206a2036928c1f41f5f7a3c3252ede5cf 100644 (file)
@@ -2726,6 +2726,11 @@ struct _virDomainVirtioOptions {
     virTristateSwitch packed;
 };
 
+
+#define SCSI_WIDE_BUS_MAX_CONT_UNIT 16
+#define SCSI_NARROW_BUS_MAX_CONT_UNIT 7
+
+
 /*
  * Guest VM main configuration
  *
@@ -2904,6 +2909,8 @@ struct _virDomainDef {
                              callbacks failed for a non-critical reason
                              (was not able to fill in some data) and thus
                              should be re-run before starting */
+
+    unsigned int scsiBusMaxUnit;
 };
 
 
@@ -3351,7 +3358,7 @@ virDomainGraphicsDefNew(virDomainXMLOption *xmlopt);
 virDomainNetDef *
 virDomainNetDefNew(virDomainXMLOption *xmlopt);
 
-virDomainDef *virDomainDefNew(void);
+virDomainDef *virDomainDefNew(virDomainXMLOption *xmlopt);
 
 void virDomainObjAssignDef(virDomainObj *domain,
                            virDomainDef *def,
index 89963942912762683523d364443150d2d1bbd404..a672901a81eb7660a94ef826c77d0b3633d44208 100644 (file)
@@ -2678,7 +2678,7 @@ hypervDomainGetXMLDesc(virDomainPtr domain, unsigned int flags)
 
     virCheckFlags(VIR_DOMAIN_XML_COMMON_FLAGS, NULL);
 
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(priv->xmlopt)))
         return NULL;
 
     virUUIDFormat(domain->uuid, uuid_string);
@@ -3048,7 +3048,7 @@ hypervDomainAttachDeviceFlags(virDomainPtr domain, const char *xml, unsigned int
     virUUIDFormat(domain->uuid, uuid_string);
 
     /* get domain definition */
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(priv->xmlopt)))
         return -1;
 
     /* get domain device definition */
index 0c3c53c1d157bdcad4bdd6ff1f1857022555f423..6a3938ead4ce53ec900e3deff371bdd1f153eeeb 100644 (file)
@@ -584,7 +584,7 @@ libxlAddDom0(libxlDriverPrivate *driver)
      * created.
      */
     if ((vm = virDomainObjListFindByID(driver->domains, 0)) == NULL) {
-        if (!(def = virDomainDefNew()))
+        if (!(def = virDomainDefNew(driver->xmlopt)))
             goto cleanup;
 
         def->id = 0;
index 5d4a273ff17a2273fae66e9c0a9a885323f8361f..850786e5c9a74474be3846b82bfcc63a2a3837c7 100644 (file)
@@ -1125,7 +1125,7 @@ xenParseXL(virConf *conf,
 {
     virDomainDef *def = NULL;
 
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(xmlopt)))
         return NULL;
 
     def->virtType = VIR_DOMAIN_VIRT_XEN;
index f978b94f9339088b255bba202e3576897d3bf358..ffcd4a7e8f059b4303439568dd187c928233b715 100644 (file)
@@ -410,7 +410,7 @@ xenParseXM(virConf *conf,
 {
     virDomainDef *def = NULL;
 
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(xmlopt)))
         return NULL;
 
     def->virtType = VIR_DOMAIN_VIRT_XEN;
index 347d5f41390f61e9a2e18cde835e9dc4b69e457a..384065291263056ca0926efbf07e6aa6f1595fd8 100644 (file)
@@ -1103,7 +1103,7 @@ lxcParseConfigString(const char *config,
     if (!(properties = virConfReadString(config, VIR_CONF_FLAG_LXC_FORMAT)))
         return NULL;
 
-    if (!(vmdef = virDomainDefNew()))
+    if (!(vmdef = virDomainDefNew(xmlopt)))
         goto error;
 
     if (virUUIDGenerate(vmdef->uuid) < 0) {
index 694b048e2bfd7d785a9a6a8d2c3f51a97c2218a6..4acbf0b1a857a79bbddeee78ddbf757d2b041c05 100644 (file)
@@ -484,7 +484,7 @@ int openvzLoadDomains(struct openvz_driver *driver)
         }
         *line++ = '\0';
 
-        if (!(def = virDomainDefNew()))
+        if (!(def = virDomainDefNew(driver->xmlopt)))
             goto cleanup;
 
         def->virtType = VIR_DOMAIN_VIRT_OPENVZ;
index 4264191a9a35764fae531ba289e5bd5c1f15edac..fc016ee6fc0e5427bb4305e2e42708fda5a5fa29 100644 (file)
@@ -9110,7 +9110,7 @@ qemuProcessQMPConnectMonitor(qemuProcessQMP *proc)
 
     if (!(xmlopt = virDomainXMLOptionNew(NULL, NULL, NULL, NULL, NULL)) ||
         !(proc->vm = virDomainObjNew(xmlopt)) ||
-        !(proc->vm->def = virDomainDefNew()))
+        !(proc->vm->def = virDomainDefNew(xmlopt)))
         goto cleanup;
 
     proc->vm->pid = proc->pid;
index 6cb5ba8928ea0950144248b54f8100d42755ce8a..ecdcdbe88dd2f0d933b944016f1f125cf8cb400c 100644 (file)
@@ -4004,7 +4004,7 @@ static char *vboxDomainGetXMLDesc(virDomainPtr dom, unsigned int flags)
     if (openSessionForMachine(data, dom->uuid, &iid, &machine) < 0)
         goto cleanup;
 
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(data->xmlopt)))
         goto cleanup;
 
     gVBoxAPI.UIMachine.GetAccessible(machine, &accessible);
@@ -4247,7 +4247,7 @@ static int vboxDomainAttachDeviceImpl(virDomainPtr dom,
         return ret;
 
     VBOX_IID_INITIALIZE(&iid);
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(data->xmlopt)))
         return ret;
 
     def->os.type = VIR_DOMAIN_OSTYPE_HVM;
@@ -4366,7 +4366,7 @@ static int vboxDomainDetachDevice(virDomainPtr dom, const char *xml)
         return ret;
 
     VBOX_IID_INITIALIZE(&iid);
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(data->xmlopt)))
         return ret;
 
     def->os.type = VIR_DOMAIN_OSTYPE_HVM;
@@ -6119,7 +6119,7 @@ static char *vboxDomainSnapshotGetXMLDesc(virDomainSnapshotPtr snapshot,
         goto cleanup;
 
     if (!(def = virDomainSnapshotDefNew()) ||
-        !(def->parent.dom = virDomainDefNew()))
+        !(def->parent.dom = virDomainDefNew(data->xmlopt)))
         goto cleanup;
     defdom = def->parent.dom;
     def->parent.name = g_strdup(snapshot->name);
index a9d0c6fece9bffcb0b6a326e61c7edcd3b9e2327..46006b47d1f57519f35866376c724b855f944e2a 100644 (file)
@@ -1445,7 +1445,7 @@ virVMXParseConfig(virVMXContext *ctx,
         goto cleanup;
 
     /* Allocate domain def */
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(xmlopt)))
         goto cleanup;
 
     def->virtType = VIR_DOMAIN_VIRT_VMWARE;
index 6d3a87315851df481fca45b5278b2444a13c9018..7871b04005fa6f4114a7c82db3fcb6a39b926aa1 100644 (file)
@@ -1789,7 +1789,7 @@ prlsdkLoadDomain(struct _vzDriver *driver,
     PRL_HANDLE job;
     char uuidstr[VIR_UUID_STRING_BRACED_BUFLEN];
 
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(driver->xmlopt)))
         goto error;
 
     if (!(def->name = prlsdkGetStringParamVar(PrlVmCfg_GetName, sdkdom)))
index ef51ed91a677a22472ad81c627a66a1a1df045f7..54622ea831c0dee90e93e8e457280da789ff6f7b 100644 (file)
@@ -100,7 +100,7 @@ testCompareBackupXML(const void *opaque)
     }
 
     /* create a fake definition and fill it with disks */
-    if (!(fakedef = virDomainDefNew()))
+    if (!(fakedef = virDomainDefNew(xmlopt)))
         return -1;
 
     fakedef->ndisks = backup->ndisks + 1;
index 136c8011b8380b8ae74050ef0f3fc7b24db0249a..ddb2fcbe6ca913fb79864b17337d50ccd7b7ba0b 100644 (file)
@@ -103,7 +103,7 @@ testReadNetworkConf(const void *data G_GNUC_UNUSED)
         .caps = openvzCapsInit(),
     };
 
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(driver.xmlopt)))
         goto cleanup;
 
     def->os.init = g_strdup("/sbin/init");
index 0513e5bfc01d7e887ef1cf5ace00bf00239e3b2d..308668f2b814688c3d217670eb9fe8707ed0aae5 100644 (file)
@@ -279,7 +279,7 @@ testQemuDiskXMLToProps(const void *opaque)
                                        VIR_DOMAIN_DEF_PARSE_STATUS)))
         return -1;
 
-    if (!(vmdef = virDomainDefNew()))
+    if (!(vmdef = virDomainDefNew(data->driver->xmlopt)))
         return -1;
 
     virDomainDiskInsert(vmdef, disk);
index 30d475ebe4ed32d7d038c73a5e4b03f9a3a31710..8618e6bbef521e780ce35619e6b6ed35b0d2dc52 100644 (file)
@@ -1038,7 +1038,7 @@ qemuMonitorCommonTestNew(virDomainXMLOption *xmlopt,
         test->vm = virDomainObjNew(xmlopt);
         if (!test->vm)
             goto error;
-        if (!(test->vm->def = virDomainDefNew()))
+        if (!(test->vm->def = virDomainDefNew(xmlopt)))
             goto error;
     }
 
index 9b65eeb994f56fe60b2a266d607e41aade78eb7d..119ad6df34c7c1d99b4848f722032c7dbb90e346 100644 (file)
@@ -67,7 +67,7 @@ testBuildDomainDef(bool dynamic,
     virDomainDef *def;
     virSecurityLabelDef *secdef = NULL;
 
-    if (!(def = virDomainDefNew()))
+    if (!(def = virDomainDefNew(NULL)))
         goto error;
 
     def->virtType = VIR_DOMAIN_VIRT_KVM;