Program: 106338
Project: 106338
Buggy source:
public void createDisk(String vmdkDatastorePath,VirtualDiskType diskType,VirtualDiskMode diskMode,String rdmDeviceName,int sizeInMb,ManagedObjectReference morDs,int controllerKey) throws Exception {
  if (s_logger.isTraceEnabled())   s_logger.trace("String_Node_Str" + _mor.getValue() + "String_Node_Str"+ vmdkDatastorePath+ "String_Node_Str"+ sizeInMb+ "String_Node_Str"+ diskType+ "String_Node_Str"+ diskMode+ "String_Node_Str"+ rdmDeviceName+ "String_Node_Str"+ morDs.getValue()+ "String_Node_Str"+ controllerKey);
  assert(vmdkDatastorePath != null);
  assert(morDs != null);
  if (controllerKey < 0) {
    controllerKey=getIDEDeviceControllerKey();
  }
  VirtualDisk newDisk=new VirtualDisk();
  if (diskType == VirtualDiskType.THIN || diskType == VirtualDiskType.PREALLOCATED || diskType == VirtualDiskType.EAGER_ZEROED_THICK) {
    VirtualDiskFlatVer2BackingInfo backingInfo=new VirtualDiskFlatVer2BackingInfo();
    backingInfo.setDiskMode(diskMode.PERSISTENT.toString());
    if (diskType == VirtualDiskType.THIN) {
      backingInfo.setThinProvisioned(true);
    }
 else {
      backingInfo.setThinProvisioned(false);
    }
    if (diskType == VirtualDiskType.EAGER_ZEROED_THICK) {
      backingInfo.setEagerlyScrub(true);
    }
 else {
      backingInfo.setEagerlyScrub(false);
    }
    backingInfo.setDatastore(morDs);
    backingInfo.setFileName(vmdkDatastorePath);
    newDisk.setBacking(backingInfo);
  }
 else   if (diskType == VirtualDiskType.RDM || diskType == VirtualDiskType.RDMP) {
    VirtualDiskRawDiskMappingVer1BackingInfo backingInfo=new VirtualDiskRawDiskMappingVer1BackingInfo();
    if (diskType == VirtualDiskType.RDM) {
      backingInfo.setCompatibilityMode("String_Node_Str");
    }
 else {
      backingInfo.setCompatibilityMode("String_Node_Str");
    }
    backingInfo.setDeviceName(rdmDeviceName);
    if (diskType == VirtualDiskType.RDM) {
      backingInfo.setDiskMode(diskMode.PERSISTENT.toString());
    }
    backingInfo.setDatastore(morDs);
    backingInfo.setFileName(vmdkDatastorePath);
    newDisk.setBacking(backingInfo);
  }
  int deviceNumber=getNextDeviceNumber(controllerKey);
  newDisk.setControllerKey(controllerKey);
  newDisk.setKey(-deviceNumber);
  newDisk.setUnitNumber(deviceNumber);
  newDisk.setCapacityInKB(sizeInMb * 1024);
  VirtualMachineConfigSpec reConfigSpec=new VirtualMachineConfigSpec();
  VirtualDeviceConfigSpec deviceConfigSpec=new VirtualDeviceConfigSpec();
  deviceConfigSpec.setDevice(newDisk);
  deviceConfigSpec.setFileOperation(VirtualDeviceConfigSpecFileOperation.CREATE);
  deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
  reConfigSpec.getDeviceChange().add(deviceConfigSpec);
  ManagedObjectReference morTask=_context.getService().reconfigVMTask(_mor,reConfigSpec);
  boolean result=_context.getVimClient().waitForTask(morTask);
  if (!result) {
    if (s_logger.isTraceEnabled())     s_logger.trace("String_Node_Str");
    throw new Exception("String_Node_Str" + vmdkDatastorePath + "String_Node_Str"+ TaskMO.getTaskFailureInfo(_context,morTask));
  }
  _context.waitForTaskProgressDone(morTask);
  if (s_logger.isTraceEnabled())   s_logger.trace("String_Node_Str");
}

Fixed version (ground truth):
public void createDisk(String vmdkDatastorePath,VirtualDiskType diskType,VirtualDiskMode diskMode,String rdmDeviceName,int sizeInMb,ManagedObjectReference morDs,int controllerKey) throws Exception {
  if (s_logger.isTraceEnabled())   s_logger.trace("String_Node_Str" + _mor.getValue() + "String_Node_Str"+ vmdkDatastorePath+ "String_Node_Str"+ sizeInMb+ "String_Node_Str"+ diskType+ "String_Node_Str"+ diskMode+ "String_Node_Str"+ rdmDeviceName+ "String_Node_Str"+ morDs.getValue()+ "String_Node_Str"+ controllerKey);
  assert(vmdkDatastorePath != null);
  assert(morDs != null);
  if (controllerKey < 0) {
    controllerKey=getIDEDeviceControllerKey();
  }
  VirtualDisk newDisk=new VirtualDisk();
  if (diskType == VirtualDiskType.THIN || diskType == VirtualDiskType.PREALLOCATED || diskType == VirtualDiskType.EAGER_ZEROED_THICK) {
    VirtualDiskFlatVer2BackingInfo backingInfo=new VirtualDiskFlatVer2BackingInfo();
    backingInfo.setDiskMode(diskMode.PERSISTENT.value());
    if (diskType == VirtualDiskType.THIN) {
      backingInfo.setThinProvisioned(true);
    }
 else {
      backingInfo.setThinProvisioned(false);
    }
    if (diskType == VirtualDiskType.EAGER_ZEROED_THICK) {
      backingInfo.setEagerlyScrub(true);
    }
 else {
      backingInfo.setEagerlyScrub(false);
    }
    backingInfo.setDatastore(morDs);
    backingInfo.setFileName(vmdkDatastorePath);
    newDisk.setBacking(backingInfo);
  }
 else   if (diskType == VirtualDiskType.RDM || diskType == VirtualDiskType.RDMP) {
    VirtualDiskRawDiskMappingVer1BackingInfo backingInfo=new VirtualDiskRawDiskMappingVer1BackingInfo();
    if (diskType == VirtualDiskType.RDM) {
      backingInfo.setCompatibilityMode("String_Node_Str");
    }
 else {
      backingInfo.setCompatibilityMode("String_Node_Str");
    }
    backingInfo.setDeviceName(rdmDeviceName);
    if (diskType == VirtualDiskType.RDM) {
      backingInfo.setDiskMode(diskMode.PERSISTENT.value());
    }
    backingInfo.setDatastore(morDs);
    backingInfo.setFileName(vmdkDatastorePath);
    newDisk.setBacking(backingInfo);
  }
  int deviceNumber=getNextDeviceNumber(controllerKey);
  newDisk.setControllerKey(controllerKey);
  newDisk.setKey(-deviceNumber);
  newDisk.setUnitNumber(deviceNumber);
  newDisk.setCapacityInKB(sizeInMb * 1024);
  VirtualMachineConfigSpec reConfigSpec=new VirtualMachineConfigSpec();
  VirtualDeviceConfigSpec deviceConfigSpec=new VirtualDeviceConfigSpec();
  deviceConfigSpec.setDevice(newDisk);
  deviceConfigSpec.setFileOperation(VirtualDeviceConfigSpecFileOperation.CREATE);
  deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
  reConfigSpec.getDeviceChange().add(deviceConfigSpec);
  ManagedObjectReference morTask=_context.getService().reconfigVMTask(_mor,reConfigSpec);
  boolean result=_context.getVimClient().waitForTask(morTask);
  if (!result) {
    if (s_logger.isTraceEnabled())     s_logger.trace("String_Node_Str");
    throw new Exception("String_Node_Str" + vmdkDatastorePath + "String_Node_Str"+ TaskMO.getTaskFailureInfo(_context,morTask));
  }
  _context.waitForTaskProgressDone(morTask);
  if (s_logger.isTraceEnabled())   s_logger.trace("String_Node_Str");
}