diff --git a/include/VirtualMachine.h b/include/VirtualMachine.h index de6bae4d4c..ee6cecb4f9 100644 --- a/include/VirtualMachine.h +++ b/include/VirtualMachine.h @@ -1335,10 +1335,13 @@ public: * Mark the disk that is going to be "save as" * @param disk_id of the VM * @param snap_id of the disk to save, -1 to select the active snapshot - * @param err_str describing the error - * @return -1 if the image cannot saveas or image_id of current disk + * @param img_id The image id used by the disk + * @param size The disk size. This may be different to the original + * image size + * @param err_str describing the error if any + * @return -1 if the image cannot saveas, 0 on success */ - int set_saveas_disk(int disk_id, int snap_id, string& err_str); + int set_saveas_disk(int disk_id, int snap_id, int &img_id, long long &size, string& err_str); /** * Set save attributes for the disk diff --git a/src/rm/RequestManagerVirtualMachine.cc b/src/rm/RequestManagerVirtualMachine.cc index 8f23e9b227..2e4d7614cb 100644 --- a/src/rm/RequestManagerVirtualMachine.cc +++ b/src/rm/RequestManagerVirtualMachine.cc @@ -1235,9 +1235,9 @@ void VirtualMachineDiskSaveas::request_execute( goto error_state; } - iid_orig = vm->set_saveas_disk(disk_id, snap_id, error); + rc = vm->set_saveas_disk(disk_id, snap_id, iid_orig, size, error); - if (iid_orig == -1) + if (rc == -1) { goto error_disk; } @@ -1259,7 +1259,6 @@ void VirtualMachineDiskSaveas::request_execute( ds_id = img->get_ds_id(); ds_name = img->get_ds_name(); - size = img->get_size(); type = img->get_type(); iname_orig = img->get_name(); diff --git a/src/vm/VirtualMachine.cc b/src/vm/VirtualMachine.cc index 736e473756..5889a1f2b5 100644 --- a/src/vm/VirtualMachine.cc +++ b/src/vm/VirtualMachine.cc @@ -3375,9 +3375,10 @@ const VectorAttribute* VirtualMachine::get_disk(int disk_id) const /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -int VirtualMachine::set_saveas_disk(int disk_id, int snap_id, string& err_str) +int VirtualMachine::set_saveas_disk(int disk_id, int snap_id, int &iid, + long long &size, string& err_str) { - int iid = -1; + iid = -1; VectorAttribute * disk = get_disk(disk_id); @@ -3389,6 +3390,7 @@ int VirtualMachine::set_saveas_disk(int disk_id, int snap_id, string& err_str) if (disk->vector_value("IMAGE_ID", iid) != 0) { + iid = -1; err_str = "DISK does not have a valid IMAGE_ID."; return -1; } @@ -3407,7 +3409,10 @@ int VirtualMachine::set_saveas_disk(int disk_id, int snap_id, string& err_str) disk->replace("HOTPLUG_SAVE_AS_ACTIVE", "YES"); disk->replace("HOTPLUG_SAVE_AS_SNAPSHOT_ID", snap_id); - return iid; + size = 0; + disk->vector_value("SIZE", size); + + return 0; } /* -------------------------------------------------------------------------- */