This makes it possible to migrate raw volumes between 'dir' and 'lvm' storages.
The call to volname_for_storage is only done when the storage types are different. The main reason is that when X is a plugin that needs more than the default implementation of print_volname, but doesn't implement its own variant yet, then migration from X to X does not break. If X is as above and a migration from Y to X happens, we end up with the old behavior (except when X and Y use the same non-standard naming scheme): Previously, the volname on Y was re-used, which is (most probably) invalid for X, so import died. Now, volname_for_storage returns a volname that (by our assumption) is invalid for X, so import dies. Signed-off-by: Fabian Ebner <f.eb...@proxmox.com> --- PVE/Storage.pm | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 7a76b2c..bd58b20 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -586,14 +586,21 @@ sub storage_migrate { my $allow_rename = $opts->{allow_rename} ? 1 : 0; # sanitize for passing as cli parameter my ($storeid, $volname) = parse_volume_id($volid); - my $target_volname = $opts->{target_volname} || $volname; my $scfg = storage_config($cfg, $storeid); + my $tcfg = storage_config($cfg, $target_storeid); # no need to migrate shared content return $volid if $storeid eq $target_storeid && $scfg->{shared}; - my $tcfg = storage_config($cfg, $target_storeid); + my $target_volname; + if ($opts->{target_volname}) { + $target_volname = $opts->{target_volname}; + } elsif ($scfg->{type} eq $tcfg->{type}) { + $target_volname = $volname; + } else { + $target_volname = volname_for_storage($cfg, $volid, $target_storeid); + } my $target_volid = "${target_storeid}:${target_volname}"; -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel