code: func (r *DiskSubresource) Relocate(l object.VirtualDeviceList, clone bool) (types.VirtualMachineRelocateSpecDiskLocator, error) {
  	log.Printf("[DEBUG] %s: Starting relocate generation", r)
  	disk, err := r.findVirtualDisk(l, clone)
  	var relocate types.VirtualMachineRelocateSpecDiskLocator
  	if err != nil {
  		return relocate, fmt.Errorf("cannot find disk device: %s", err)
  	}
  
  	// Expand all of the necessary disk settings first. This ensures all backing
  	// data is properly populate and updated.
  	if err := r.expandDiskSettings(disk); err != nil {
  		return relocate, err
  	}
  
  	relocate.DiskId = disk.Key
  
  	// Set the datastore for the relocation
  	dsID := r.Get("datastore_id").(string)
  	if dsID == "" {
  		// Default to the default datastore
  		dsID = r.rdd.Get("datastore_id").(string)
  	}
  	ds, err := datastore.FromID(r.client, dsID)
  	if err != nil {
  		return relocate, err
  	}
  	dsref := ds.Reference()
  	relocate.Datastore = dsref
  
  	// Add additional backing options if we are cloning.
  	if r.rdd.Id() == "" {
  		log.Printf("[DEBUG] %s: Adding additional options to relocator for cloning", r)
  
  		backing := disk.Backing.(*types.VirtualDiskFlatVer2BackingInfo)
  		backing.FileName = ds.Path("")
  		backing.Datastore = &dsref
  		relocate.DiskBackingInfo = backing
  	}
  
  	// Done!
  	log.Printf("[DEBUG] %s: Generated disk locator: %s", r, diskRelocateString(relocate))
  	log.Printf("[DEBUG] %s: Relocate generation complete", r)
  	return relocate, nil
  }
docs: // Relocate produces a VirtualMachineRelocateSpecDiskLocator for this resource
  // and is used for both cloning and storage vMotion.