From f420dd55fb5c4ec40aec0232618b2162c6d2f88c Mon Sep 17 00:00:00 2001 From: Likitha Shetty Date: Mon, 1 Dec 2014 19:49:06 +0530 Subject: [PATCH] CLOUDSTACK-8119. [VMware] Cannot attach more than 8 volumes to a VM. While attaching a new disk to an instance, the unit number on the controller key should be the lowest unit number that is not in use. And in case the controller type is SCSI it shouln't be the reserved SCSI unit number. --- .../com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java | 9 ++++----- .../com/cloud/hypervisor/vmware/util/VmwareHelper.java | 8 -------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java index be39bfb3a5a..8f05021181c 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -1018,8 +1018,6 @@ public class VirtualMachineMO extends BaseMO { } int deviceNumber = getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && VmwareHelper.isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; newDisk.setControllerKey(controllerKey); newDisk.setKey(-deviceNumber); @@ -1858,8 +1856,6 @@ public class VirtualMachineMO extends BaseMO { public int getNextScsiDiskDeviceNumber() throws Exception { int scsiControllerKey = getScsiDeviceControllerKey(); int deviceNumber = getNextDeviceNumber(scsiControllerKey); - if (VmwareHelper.isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; return deviceNumber; } @@ -2319,6 +2315,7 @@ public class VirtualMachineMO extends BaseMO { List existingUnitNumbers = new ArrayList(); int deviceNumber = 0; + int ideControllerKey = getIDEDeviceControllerKey(); if (devices != null && devices.size() > 0) { for (VirtualDevice device : devices) { if (device.getControllerKey() != null && device.getControllerKey().intValue() == controllerKey) { @@ -2327,8 +2324,10 @@ public class VirtualMachineMO extends BaseMO { } } while (true) { + // Next device number should be the lowest device number on the key that is not in use and is not reserved. if (!existingUnitNumbers.contains(Integer.valueOf(deviceNumber))) { - break; + if (controllerKey != ideControllerKey && !VmwareHelper.isReservedScsiDeviceNumber(deviceNumber)) + break; } ++deviceNumber; } diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java index f31ffc04c40..e38e7eee996 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java @@ -188,8 +188,6 @@ public class VmwareHelper { controllerKey = ideControllerKey; if (deviceNumber < 0) { deviceNumber = vmMo.getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; } disk.setControllerKey(controllerKey); @@ -261,8 +259,6 @@ public class VmwareHelper { disk.setControllerKey(controllerKey); if (deviceNumber < 0) { deviceNumber = vmMo.getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; } disk.setKey(-contextNumber); @@ -300,8 +296,6 @@ public class VmwareHelper { controllerKey = ideControllerKey; if (deviceNumber < 0) { deviceNumber = vmMo.getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; } disk.setControllerKey(controllerKey); @@ -354,8 +348,6 @@ public class VmwareHelper { controllerKey = ideControllerKey; if (deviceNumber < 0) { deviceNumber = vmMo.getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; } disk.setControllerKey(controllerKey);