Skip to content

Commit a4cc987

Browse files
author
Sateesh Chodapuneedi
committed
CLOUDSTACK-4787 Allow selection of scsi controller type in vSphere
commit #7 So far only 1 controller (scsi or ide) is supported in Cloudstack for ide or scsi, this is existing limitation. Added support for 2nd IDE controller. Support adding IDE virtual disk to VM. Also added check if VM is running as IDE virtual disk cannot be attached to VM if VM is runnning.If user detaches a virtual disk on lower unit number of controller, then subsequent attach operation should find free unit number on the controller and attach the virtual disk there. commit #6 Let the controllers of existing VMs continue without flip, current busInfo retrieved from chain_info field of volume record from database would be preferred over controller settings from all configuration settings. commit #5 Editing global configuration param vmware.root.disk.controller osdefault value results in loss of previous root disk controller type. Hence root disk's controller type for legacy VMs is unknow post that modificaiton by user. If VM is stop/start then we could get this infromation from bus info of existing volume. But if user resets VM and then try to start VM. The existing bus info would be lost. Hence existing disk info is not available to depend on. Using lsilogic or generic scsi controller for ROOT disk of legacy VMs if reset. commit #4 Avoid adding additional (>1) scsi controllers to system vms. While attaching volume to legacy VM don't use osdefault optoin which applicable only for VM created with the option enabled, use legacy data disk controller type (lsilogic) commit #3 If root disk's controller type is scsi and data disk controller type condenses to any of scsi sub-types then data disk controller type would fall back to root disk controller itself. This ensures data volumes would be accessible in all cases as controller of root volume would be reliable and it means VM has the supported controller. It also avoids mix of scsi controller sub-types in a user instance. Also translating disk controller type scsi to lsilogic. commit #2 Support auto detection of recommended virtual disk controller type for specific guest OS. commit #1 Support granual controller types. Add support for controller types in template registration as well. Fix white spaces. Removed stale HEAD merge lines Removed tail of merge lines Fixed VmwareResource, removing storage commands that moved to VmwareStorageProcessor. removed stale code of controller that is present in processor Fixed check style errors. Fixed injection. Tested with Linux and windows templates. Unable to run iso based tests due to few bugs in register iso area. Signed-off-by: Sateesh Chodapuneedi <[email protected]>
1 parent 06d4458 commit a4cc987

File tree

19 files changed

+1142
-63
lines changed

19 files changed

+1142
-63
lines changed

api/src/com/cloud/vm/VmDetailConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ public interface VmDetailConstants {
2222
public static final String ROOK_DISK_CONTROLLER = "rootDiskController";
2323
public static final String NESTED_VIRTUALIZATION_FLAG = "nestedVirtualizationFlag";
2424
public static final String HYPERVISOR_TOOLS_VERSION = "hypervisortoolsversion";
25+
public static final String DATA_DISK_CONTROLLER = "dataDiskController";
2526
}

core/src/org/apache/cloudstack/storage/command/AttachCommand.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,35 @@
1919

2020
package org.apache.cloudstack.storage.command;
2121

22+
import java.util.Map;
23+
2224
import com.cloud.agent.api.Command;
2325
import com.cloud.agent.api.to.DiskTO;
2426

2527
public final class AttachCommand extends Command implements StorageSubSystemCommand {
2628
private DiskTO disk;
2729
private String vmName;
2830
private boolean inSeq = false;
31+
private Map<String, String> controllerInfo;
2932

3033
public AttachCommand(DiskTO disk, String vmName) {
3134
super();
3235
this.disk = disk;
3336
this.vmName = vmName;
3437
}
38+
public AttachCommand(DiskTO disk, String vmName, Map<String, String> controllerInfo) {
39+
super();
40+
this.disk = disk;
41+
this.vmName = vmName;
42+
this.controllerInfo = controllerInfo;
43+
}
44+
45+
public Map<String, String> getControllerInfo() {
46+
return controllerInfo;
47+
}
48+
public void setControllerInfo(Map<String, String> controllerInfo) {
49+
this.controllerInfo = controllerInfo;
50+
}
3551

3652
@Override
3753
public boolean executeInSequence() {

plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import com.cloud.hypervisor.HypervisorGuru;
7070
import com.cloud.hypervisor.HypervisorGuruBase;
7171
import com.cloud.hypervisor.vmware.manager.VmwareManager;
72+
import com.cloud.hypervisor.vmware.mo.DiskControllerType;
7273
import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
7374
import com.cloud.network.Network.Provider;
7475
import com.cloud.network.Network.Service;
@@ -208,6 +209,12 @@ public VirtualMachineTO implement(VirtualMachineProfile vm) {
208209
details.put(VmDetailConstants.ROOK_DISK_CONTROLLER, _vmwareMgr.getRootDiskController());
209210
}
210211
}
212+
String diskController = details.get(VmDetailConstants.DATA_DISK_CONTROLLER);
213+
if (userVm) {
214+
if (diskController == null) {
215+
details.put(VmDetailConstants.DATA_DISK_CONTROLLER, DiskControllerType.lsilogic.toString());
216+
}
217+
}
211218

212219
List<NicProfile> nicProfiles = vm.getNics();
213220

plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,6 @@ public interface VmwareManager {
7878

7979
boolean isLegacyZone(long dcId);
8080

81+
public String getDataDiskController();
8182
boolean hasNexusVSM(Long clusterId);
8283
}

plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
185185

186186
private String _rootDiskController = DiskControllerType.ide.toString();
187187

188+
private String _dataDiskController = DiskControllerType.osdefault.toString();
189+
188190
private final Map<String, String> _storageMounts = new HashMap<String, String>();
189191

190192
private final Random _rand = new Random(System.currentTimeMillis());
@@ -478,6 +480,7 @@ public void setupResourceStartupParams(Map<String, Object> params) {
478480
params.put("service.console.name", _serviceConsoleName);
479481
params.put("management.portgroup.name", _managemetPortGroupName);
480482
params.put("vmware.root.disk.controller", _rootDiskController);
483+
params.put("vmware.data.disk.controller", _dataDiskController);
481484
params.put("vmware.recycle.hung.wokervm", _recycleHungWorker);
482485
params.put("ports.per.dvportgroup", _portsPerDvPortGroup);
483486
}
@@ -930,6 +933,11 @@ public String getRootDiskController() {
930933
return _rootDiskController;
931934
}
932935

936+
@Override
937+
public String getDataDiskController() {
938+
return _dataDiskController;
939+
}
940+
933941
@Override
934942
public int getVcenterSessionTimeout() {
935943
return _vCenterSessionTimeout;

plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java

Lines changed: 194 additions & 13 deletions
Large diffs are not rendered by default.

plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,14 @@
7373
import com.cloud.agent.api.to.DiskTO;
7474
import com.cloud.agent.api.to.NfsTO;
7575
import com.cloud.hypervisor.vmware.manager.VmwareHostService;
76+
import com.cloud.hypervisor.vmware.manager.VmwareManager;
7677
import com.cloud.hypervisor.vmware.manager.VmwareStorageMount;
7778
import com.cloud.hypervisor.vmware.mo.ClusterMO;
7879
import com.cloud.hypervisor.vmware.mo.CustomFieldConstants;
7980
import com.cloud.hypervisor.vmware.mo.DatacenterMO;
8081
import com.cloud.hypervisor.vmware.mo.DatastoreFile;
8182
import com.cloud.hypervisor.vmware.mo.DatastoreMO;
83+
import com.cloud.hypervisor.vmware.mo.DiskControllerType;
8284
import com.cloud.hypervisor.vmware.mo.HostDatastoreSystemMO;
8385
import com.cloud.hypervisor.vmware.mo.HostMO;
8486
import com.cloud.hypervisor.vmware.mo.HostStorageSystemMO;
@@ -102,15 +104,16 @@
102104
import com.cloud.utils.exception.CloudRuntimeException;
103105
import com.cloud.utils.script.Script;
104106
import com.cloud.vm.VirtualMachine.PowerState;
107+
import com.cloud.vm.VmDetailConstants;
105108

106109
public class VmwareStorageProcessor implements StorageProcessor {
107110
private static final Logger s_logger = Logger.getLogger(VmwareStorageProcessor.class);
108111

109-
private VmwareHostService hostService;
110-
private boolean _fullCloneFlag;
111-
private VmwareStorageMount mountService;
112-
private VmwareResource resource;
113-
private Integer _timeout;
112+
private final VmwareHostService hostService;
113+
private final boolean _fullCloneFlag;
114+
private final VmwareStorageMount mountService;
115+
private final VmwareResource resource;
116+
private final Integer _timeout;
114117
protected Integer _shutdownWaitMs;
115118
private final Gson _gson;
116119
private final StorageLayer _storage = new JavaStorageLayer();
@@ -1288,10 +1291,10 @@ public Answer attachVolume(AttachCommand cmd) {
12881291
String storageHost = details.get(DiskTO.STORAGE_HOST);
12891292
int storagePort = Integer.parseInt(details.get(DiskTO.STORAGE_PORT));
12901293

1291-
return this.attachVolume(cmd, cmd.getDisk(), true, isManaged, cmd.getVmName(), iScsiName, storageHost, storagePort);
1294+
return this.attachVolume(cmd, cmd.getDisk(), true, isManaged, cmd.getVmName(), iScsiName, storageHost, storagePort, cmd.getControllerInfo());
12921295
}
12931296

1294-
private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName, String iScsiName, String storageHost, int storagePort) {
1297+
private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName, String iScsiName, String storageHost, int storagePort, Map<String, String> controllerInfo) {
12951298
VolumeObjectTO volumeTO = (VolumeObjectTO)disk.getData();
12961299
DataStoreTO primaryStore = volumeTO.getDataStore();
12971300
try {
@@ -1351,7 +1354,24 @@ private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean
13511354
AttachAnswer answer = new AttachAnswer(disk);
13521355

13531356
if (isAttach) {
1354-
vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs);
1357+
String dataDiskController = controllerInfo.get(VmDetailConstants.DATA_DISK_CONTROLLER);
1358+
String rootDiskController = controllerInfo.get(VmDetailConstants.ROOK_DISK_CONTROLLER);
1359+
DiskControllerType rootDiskControllerType = DiskControllerType.getType(rootDiskController);
1360+
1361+
if (dataDiskController == null) {
1362+
dataDiskController = getLegacyVmDataDiskController();
1363+
} else if ((rootDiskControllerType == DiskControllerType.lsilogic) ||
1364+
(rootDiskControllerType == DiskControllerType.lsisas1068) ||
1365+
(rootDiskControllerType == DiskControllerType.pvscsi) ||
1366+
(rootDiskControllerType == DiskControllerType.buslogic)) {
1367+
//TODO: Support mix of SCSI controller types for single VM. If root disk is already over
1368+
//a SCSI controller then use the same for data volume as well. This limitation will go once mix
1369+
//of SCSI controller types for single VM.
1370+
dataDiskController = rootDiskController;
1371+
} else if (DiskControllerType.getType(dataDiskController) == DiskControllerType.osdefault) {
1372+
dataDiskController = vmMo.getRecommendedDiskController(null);
1373+
}
1374+
vmMo.attachDisk(new String[] {datastoreVolumePath}, morDs, dataDiskController);
13551375
} else {
13561376
vmMo.removeAllSnapshots();
13571377
vmMo.detachDisk(datastoreVolumePath, false);
@@ -1489,7 +1509,7 @@ public Answer dettachIso(DettachCommand cmd) {
14891509

14901510
@Override
14911511
public Answer dettachVolume(DettachCommand cmd) {
1492-
return this.attachVolume(cmd, cmd.getDisk(), false, cmd.isManaged(), cmd.getVmName(), cmd.get_iScsiName(), cmd.getStorageHost(), cmd.getStoragePort());
1512+
return this.attachVolume(cmd, cmd.getDisk(), false, cmd.isManaged(), cmd.getVmName(), cmd.get_iScsiName(), cmd.getStorageHost(), cmd.getStoragePort(), null);
14931513
}
14941514

14951515
@Override
@@ -2245,4 +2265,28 @@ private static String deriveTemplateUuidOnHost(VmwareHypervisorHost hyperHost, S
22452265
templateUuid = templateUuid.replaceAll("-", "");
22462266
return templateUuid;
22472267
}
2268+
2269+
private String getControllerFromConfigurationSetting() throws Exception {
2270+
String diskController = null;
2271+
VmwareContext context = null;
2272+
try {
2273+
context = hostService.getServiceContext(null);
2274+
VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
2275+
diskController = mgr.getDataDiskController();
2276+
} catch (Throwable e) {
2277+
if (e instanceof RemoteException) {
2278+
s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
2279+
hostService.invalidateServiceContext(context);
2280+
}
2281+
2282+
String details = "Failed to connect to vCenter due to " + VmwareHelper.getExceptionMessage(e);
2283+
s_logger.error(details, e);
2284+
}
2285+
2286+
return diskController;
2287+
}
2288+
2289+
private String getLegacyVmDataDiskController() throws Exception {
2290+
return DiskControllerType.lsilogic.toString();
2291+
}
22482292
}

server/src/com/cloud/storage/VolumeApiServiceImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@
138138
import com.cloud.vm.VMInstanceVO;
139139
import com.cloud.vm.VirtualMachine;
140140
import com.cloud.vm.VirtualMachine.State;
141+
import com.cloud.vm.VmDetailConstants;
141142
import com.cloud.vm.VmWork;
142143
import com.cloud.vm.VmWorkAttachVolume;
143144
import com.cloud.vm.VmWorkConstants;
@@ -2321,6 +2322,11 @@ private VolumeVO sendAttachVolumeCommand(UserVmVO vm, VolumeVO volumeToAttach, L
23212322
details.put(DiskTO.CHAP_TARGET_USERNAME, chapInfo.getTargetUsername());
23222323
details.put(DiskTO.CHAP_TARGET_SECRET, chapInfo.getTargetSecret());
23232324
}
2325+
_userVmDao.loadDetails(vm);
2326+
Map<String, String> controllerInfo = new HashMap<String, String>();
2327+
controllerInfo.put(VmDetailConstants.ROOK_DISK_CONTROLLER, vm.getDetail(VmDetailConstants.ROOK_DISK_CONTROLLER));
2328+
controllerInfo.put(VmDetailConstants.DATA_DISK_CONTROLLER, vm.getDetail(VmDetailConstants.DATA_DISK_CONTROLLER));
2329+
cmd.setControllerInfo(controllerInfo);
23242330

23252331
try {
23262332
answer = (AttachAnswer)_agentMgr.send(hostId, cmd);

server/src/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3111,8 +3111,17 @@ public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCap
31113111
if (guestOS.getDisplayName().toLowerCase().contains("apple mac os")) {
31123112
vm.setDetail("smc.present", "TRUE");
31133113
vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, "scsi");
3114+
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi");
31143115
vm.setDetail("firmware", "efi");
31153116
s_logger.info("guestOS is OSX : overwrite root disk controller to scsi, use smc and efi");
3117+
} else {
3118+
String controllerSetting = _configDao.getValue("vmware.root.disk.controller");
3119+
vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, controllerSetting);
3120+
if (controllerSetting.equalsIgnoreCase("scsi")) {
3121+
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi");
3122+
} else {
3123+
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "osdefault");
3124+
}
31163125
}
31173126
}
31183127

vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.vmware.vim25.CustomFieldStringValue;
3535
import com.vmware.vim25.DatastoreInfo;
3636
import com.vmware.vim25.DynamicProperty;
37+
import com.vmware.vim25.GuestOsDescriptor;
3738
import com.vmware.vim25.HostHardwareSummary;
3839
import com.vmware.vim25.HostIpRouteEntry;
3940
import com.vmware.vim25.HostRuntimeInfo;
@@ -46,9 +47,11 @@
4647
import com.vmware.vim25.PropertyFilterSpec;
4748
import com.vmware.vim25.PropertySpec;
4849
import com.vmware.vim25.TraversalSpec;
50+
import com.vmware.vim25.VirtualMachineConfigOption;
4951
import com.vmware.vim25.VirtualMachineConfigSpec;
5052

5153
import com.cloud.hypervisor.vmware.util.VmwareContext;
54+
import com.cloud.hypervisor.vmware.util.VmwareHelper;
5255
import com.cloud.utils.Pair;
5356
import com.cloud.utils.exception.CloudRuntimeException;
5457

@@ -271,7 +274,7 @@ public void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo,
271274

272275
@Override
273276
public boolean createBlankVm(String vmName, String vmInternalCSName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB,
274-
int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
277+
int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent, Pair<String, String> controllerInfo, Boolean systemVm) throws Exception {
275278

276279
if (s_logger.isTraceEnabled())
277280
s_logger.trace("vCenter API trace - createBlankVm(). target MOR: " + _mor.getValue() + ", vmName: " + vmName + ", cpuCount: " + cpuCount + ", cpuSpeedMhz: " +
@@ -280,7 +283,7 @@ public boolean createBlankVm(String vmName, String vmInternalCSName, int cpuCoun
280283

281284
boolean result =
282285
HypervisorHostHelper.createBlankVm(this, vmName, vmInternalCSName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse, memoryMB, memoryReserveMB,
283-
guestOsIdentifier, morDs, snapshotDirToParent);
286+
guestOsIdentifier, morDs, snapshotDirToParent, controllerInfo, systemVm);
284287

285288
if (s_logger.isTraceEnabled())
286289
s_logger.trace("vCenter API trace - createBlankVm() done");
@@ -582,4 +585,32 @@ public LicenseAssignmentManagerMO getLicenseAssignmentManager() throws Exception
582585
// LicenseAssignmentManager deals with only host/vcenter licenses only. Has nothing todo with cluster
583586
throw new CloudRuntimeException("Unable to get LicenseAssignmentManager at cluster level");
584587
}
588+
private ManagedObjectReference getEnvironmentBrowser() throws Exception {
589+
if (_environmentBrowser == null) {
590+
_environmentBrowser = _context.getVimClient().getMoRefProp(_mor, "environmentBrowser");
591+
}
592+
return _environmentBrowser;
593+
}
594+
@Override
595+
public String getRecommendedDiskController(String guestOsId) throws Exception {
596+
VirtualMachineConfigOption vmConfigOption = _context.getService().queryConfigOption(getEnvironmentBrowser(), null, null);
597+
GuestOsDescriptor guestOsDescriptor = null;
598+
String diskController = null;
599+
List<GuestOsDescriptor> guestDescriptors = vmConfigOption.getGuestOSDescriptor();
600+
for (GuestOsDescriptor descriptor : guestDescriptors) {
601+
if (guestOsId != null && guestOsId.equalsIgnoreCase(descriptor.getId())) {
602+
guestOsDescriptor = descriptor;
603+
break;
604+
}
605+
}
606+
if (guestOsDescriptor != null) {
607+
diskController = VmwareHelper.getRecommendedDiskControllerFromDescriptor(guestOsDescriptor);
608+
s_logger.debug("Retrieved recommended disk controller for guest OS : " + guestOsId + " in cluster " + getHyperHostName() + " : " + diskController);
609+
return diskController;
610+
} else {
611+
String msg = "Unable to retrieve recommended disk controller for guest OS : " + guestOsId + " in cluster " + getHyperHostName();
612+
s_logger.error(msg);
613+
throw new CloudRuntimeException(msg);
614+
}
615+
}
585616
}

vmware-base/src/com/cloud/hypervisor/vmware/mo/DiskControllerType.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,34 @@
1717
package com.cloud.hypervisor.vmware.mo;
1818

1919
public enum DiskControllerType {
20-
ide, scsi
20+
ide,
21+
scsi,
22+
osdefault,
23+
lsilogic,
24+
lsisas1068,
25+
buslogic,
26+
pvscsi,
27+
none;
28+
public static DiskControllerType getType(String diskController) {
29+
if (diskController == null || diskController.equalsIgnoreCase("osdefault")) {
30+
return DiskControllerType.osdefault;
31+
} else if (diskController.equalsIgnoreCase("vim.vm.device.VirtualLsiLogicSASController") || diskController.equalsIgnoreCase("VirtualLsiLogicSASController")
32+
|| diskController.equalsIgnoreCase(ScsiDiskControllerType.LSILOGIC_SAS)) {
33+
return DiskControllerType.lsisas1068;
34+
} else if (diskController.equalsIgnoreCase("vim.vm.device.VirtualLsiLogicController") || diskController.equalsIgnoreCase("VirtualLsiLogicController")
35+
|| diskController.equalsIgnoreCase(ScsiDiskControllerType.LSILOGIC_PARALLEL) || diskController.equalsIgnoreCase("scsi")) {
36+
return DiskControllerType.lsilogic;
37+
} else if (diskController.equalsIgnoreCase("vim.vm.device.VirtualIDEController") || diskController.equalsIgnoreCase("VirtualIDEController")
38+
|| diskController.equalsIgnoreCase("ide")) {
39+
return DiskControllerType.ide;
40+
} else if (diskController.equalsIgnoreCase("vim.vm.device.ParaVirtualSCSIController") || diskController.equalsIgnoreCase("ParaVirtualSCSIController")
41+
|| diskController.equalsIgnoreCase(ScsiDiskControllerType.VMWARE_PARAVIRTUAL)) {
42+
return DiskControllerType.pvscsi;
43+
} else if (diskController.equalsIgnoreCase("vim.vm.device.VirtualBusLogicController") || diskController.equalsIgnoreCase("VirtualBusLogicController")
44+
|| diskController.equalsIgnoreCase(ScsiDiskControllerType.BUSLOGIC)) {
45+
return DiskControllerType.buslogic;
46+
} else {
47+
return DiskControllerType.none;
48+
}
49+
}
2150
}

0 commit comments

Comments
 (0)