From 4708a0b40dce0c4503a63e79190aefe0c011e298 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. (cherry picked from commit f420dd55fb5c4ec40aec0232618b2162c6d2f88c) Signed-off-by: Rohit Yadav --- .../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 c0378422b2a..8f9eec023d8 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java @@ -1056,8 +1056,6 @@ public class VirtualMachineMO extends BaseMO { } int deviceNumber = getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && VmwareHelper.isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; newDisk.setControllerKey(controllerKey); newDisk.setKey(-deviceNumber); @@ -1911,8 +1909,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; } @@ -2381,6 +2377,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) { @@ -2389,8 +2386,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 5e3daa24a47..7c692100008 100644 --- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java @@ -189,8 +189,6 @@ public class VmwareHelper { controllerKey = ideControllerKey; if (deviceNumber < 0) { deviceNumber = vmMo.getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; } disk.setControllerKey(controllerKey); @@ -262,8 +260,6 @@ public class VmwareHelper { disk.setControllerKey(controllerKey); if (deviceNumber < 0) { deviceNumber = vmMo.getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; } disk.setKey(-contextNumber); @@ -301,8 +297,6 @@ public class VmwareHelper { controllerKey = ideControllerKey; if (deviceNumber < 0) { deviceNumber = vmMo.getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; } disk.setControllerKey(controllerKey); @@ -355,8 +349,6 @@ public class VmwareHelper { controllerKey = ideControllerKey; if (deviceNumber < 0) { deviceNumber = vmMo.getNextDeviceNumber(controllerKey); - if (controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber)) - deviceNumber++; } disk.setControllerKey(controllerKey);