Adds the ability to change the owner of a guest image. Btrfs does not need special commands to rename a subvolume and this can be achieved the same as in Storage/plugin.pm's rename_volume taking special care of how the directory structure used by Btrfs.
Signed-off-by: Maximiliano Sandoval <m.sando...@proxmox.com> --- Differences from v3: - add qcow2 and vmdk support for rename - remove unused $ppath variable Differences from v2: - use indices instead of assigning to undef 5 times Differences from v1: - avoid assigning unused values of returned list to variables src/PVE/Storage/BTRFSPlugin.pm | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/PVE/Storage/BTRFSPlugin.pm b/src/PVE/Storage/BTRFSPlugin.pm index 42815cb..385ac30 100644 --- a/src/PVE/Storage/BTRFSPlugin.pm +++ b/src/PVE/Storage/BTRFSPlugin.pm @@ -618,6 +618,9 @@ sub volume_has_feature { base => { qcow2 => 1, raw => 1, vmdk => 1 }, current => { qcow2 => 1, raw => 1, vmdk => 1 }, }, + rename => { + current => { qcow2 => 1, raw => 1, vmdk => 1 }, + }, }; my ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $format) = $class->parse_volname($volname); @@ -930,4 +933,34 @@ sub volume_import { return "$storeid:$volname"; } +sub rename_volume { + my ($class, $scfg, $storeid, $source_volname, $target_vmid, $target_volname) = @_; + die "no path found\n" if !$scfg->{path}; + + my $format = ($class->parse_volname($source_volname))[6]; + + if ($format ne 'raw' && $format ne 'subvol') { + return $class->SUPER::rename_volume($scfg, $storeid, $source_volname, $target_vmid, $target_volname); + } + + $target_volname = $class->find_free_diskname($storeid, $scfg, $target_vmid, $format, 1) + if !$target_volname; + $target_volname = "$target_vmid/$target_volname"; + + my $basedir = $class->get_subdir($scfg, 'images'); + + mkpath "${basedir}/${target_vmid}"; + my $source_dir = raw_name_to_dir($source_volname); + my $target_dir = raw_name_to_dir($target_volname); + + my $old_path = "${basedir}/${source_dir}"; + my $new_path = "${basedir}/${target_dir}"; + + die "target volume '${target_volname}' already exists\n" if -e $new_path; + rename $old_path, $new_path || + die "rename '$old_path' to '$new_path' failed - $!\n"; + + return "${storeid}:$target_volname"; +} + 1 -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel