]> xenbits.xensource.com Git - libvirt.git/commitdiff
vz: set default SCSI model
authorMikhail Feoktistov <mfeoktistov@virtuozzo.com>
Tue, 15 Mar 2016 07:47:51 +0000 (10:47 +0300)
committerMaxim Nestratov <mnestratov@virtuozzo.com>
Wed, 16 Mar 2016 16:34:27 +0000 (19:34 +0300)
Each version of virtuozzo supports only one type of SCSI controller
So if we add disk on SCSI bus, we should set SCSI controller model.
We can take it from vzCapabilities structure.

src/vz/vz_driver.c
src/vz/vz_sdk.c
src/vz/vz_sdk.h
src/vz/vz_utils.c
src/vz/vz_utils.h

index 74e1f5dc334d3d8f454170370004316d3b8498ef..b02e59fb8809b03109d16f28eb29ec9d381c7348 100644 (file)
@@ -1080,7 +1080,7 @@ static int vzDomainAttachDeviceFlags(virDomainPtr dom, const char *xml,
 
     switch (dev->type) {
     case VIR_DOMAIN_DEVICE_DISK:
-        ret = prlsdkAttachVolume(privdom, dev->data.disk);
+        ret = prlsdkAttachVolume(privconn, privdom, dev->data.disk);
         if (ret) {
             virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                            _("disk attach failed"));
index eac6fb79fb4f688919eb4baa0ecdd01f41e26537..14738660d21f61fd9d2fcb9c9b58fba8a2c1aa80 100644 (file)
@@ -2989,7 +2989,8 @@ static int prlsdkDelDisk(PRL_HANDLE sdkdom, int idx)
     return ret;
 }
 
-static int prlsdkAddDisk(PRL_HANDLE sdkdom,
+static int prlsdkAddDisk(vzConnPtr privconn,
+                         PRL_HANDLE sdkdom,
                          virDomainDiskDefPtr disk,
                          bool bootDisk,
                          bool isCt)
@@ -3003,6 +3004,7 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
     virDomainDeviceDriveAddressPtr drive;
     PRL_UINT32 devIndex;
     PRL_DEVICE_TYPE devType;
+    PRL_CLUSTERED_DEVICE_SUBTYPE scsiModel;
     char *dst = NULL;
 
     if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)
@@ -3100,6 +3102,13 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
         goto cleanup;
     }
 
+    if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI) {
+        if (vzGetDefaultSCSIModel(privconn, &scsiModel) < 0)
+            goto cleanup;
+        pret = PrlVmDev_SetSubType(sdkdisk, scsiModel);
+        prlsdkCheckRetGoto(pret, cleanup);
+    }
+
     pret = PrlVmDev_SetIfaceType(sdkdisk, sdkbus);
     prlsdkCheckRetGoto(pret, cleanup);
 
@@ -3147,7 +3156,9 @@ static int prlsdkAddDisk(PRL_HANDLE sdkdom,
 }
 
 int
-prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk)
+prlsdkAttachVolume(vzConnPtr privconn,
+                   virDomainObjPtr dom,
+                   virDomainDiskDefPtr disk)
 {
     int ret = -1;
     vzDomObjPtr privdom = dom->privateData;
@@ -3157,7 +3168,11 @@ prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk)
     if (PRL_FAILED(waitJob(job)))
         goto cleanup;
 
-    ret = prlsdkAddDisk(privdom->sdkdom, disk, false, IS_CT(dom->def));
+    ret = prlsdkAddDisk(privconn,
+                        privdom->sdkdom,
+                        disk,
+                        false,
+                        IS_CT(dom->def));
     if (ret == 0) {
         job = PrlVm_CommitEx(privdom->sdkdom, PVCF_DETACH_HDD_BUNDLE);
         if (PRL_FAILED(waitJob(job))) {
@@ -3388,7 +3403,11 @@ prlsdkDoApplyConfig(virConnectPtr conn,
             needBoot = false;
             bootDisk = true;
         }
-        if (prlsdkAddDisk(sdkdom, def->disks[i], bootDisk, IS_CT(def)) < 0)
+        if (prlsdkAddDisk(conn->privateData,
+                          sdkdom,
+                          def->disks[i],
+                          bootDisk,
+                          IS_CT(def)) < 0)
             goto error;
     }
 
index c2d9cb46971b9dc02bca8094f7e1a8d7bbd36e85..8a38797272a76482f5db6c2e6c08f693cb9ec5ba 100644 (file)
@@ -63,7 +63,7 @@ prlsdkUnregisterDomain(vzConnPtr privconn, virDomainObjPtr dom, unsigned int fla
 int
 prlsdkDomainManagedSaveRemove(virDomainObjPtr dom);
 int
-prlsdkAttachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
+prlsdkAttachVolume(vzConnPtr privconn, virDomainObjPtr dom, virDomainDiskDefPtr disk);
 int
 prlsdkDetachVolume(virDomainObjPtr dom, virDomainDiskDefPtr disk);
 int
index cca58ec764bd45b07c300ecae42d39a309ec2819..fed48a5b406a1228c2cfbd24931fe3ae3bd63eae 100644 (file)
@@ -475,3 +475,23 @@ vzCheckUnsupportedControllers(virDomainDefPtr def, vzCapabilitiesPtr vzCaps)
     }
     return 0;
 }
+
+int vzGetDefaultSCSIModel(vzConnPtr privconn,
+                          PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel)
+{
+    switch (privconn->vzCaps.scsiControllerModel) {
+    case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_VIRTIO_SCSI:
+        *scsiModel = PCD_VIRTIO_SCSI;
+        break;
+    case VIR_DOMAIN_CONTROLLER_MODEL_SCSI_BUSLOGIC:
+        *scsiModel = PCD_BUSLOGIC;
+        break;
+    default:
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Unknown SCSI controller model %s"),
+                       virDomainControllerModelSCSITypeToString(
+                           privconn->vzCaps.scsiControllerModel));
+        return -1;
+    }
+    return 0;
+}
index 88e74fc58267cf2289d36acbe7842ce53e76c172..f3738502cc6af065a757a57d4417bb28bbcdf314 100644 (file)
@@ -118,6 +118,9 @@ vzCheckUnsupportedDisks(virDomainDefPtr def,
 int
 vzCheckUnsupportedControllers(virDomainDefPtr def,
                               vzCapabilitiesPtr vzCaps);
+int
+vzGetDefaultSCSIModel(vzConnPtr privconn,
+                      PRL_CLUSTERED_DEVICE_SUBTYPE *scsiModel);
 
 # define PARALLELS_BLOCK_STATS_FOREACH(OP)                              \
     OP(rd_req, VIR_DOMAIN_BLOCK_STATS_READ_REQ, "read_requests")        \