diff --git a/patches/PVE_VitastorPlugin.pm b/patches/PVE_VitastorPlugin.pm index 32e39e83b..bc52d331c 100644 --- a/patches/PVE_VitastorPlugin.pm +++ b/patches/PVE_VitastorPlugin.pm @@ -249,6 +249,7 @@ sub clone_image sub alloc_image { + # $size is in kb in this method my ($class, $storeid, $scfg, $vmid, $fmt, $name, $size) = @_; my $prefix = defined $scfg->{vitastor_prefix} ? $scfg->{vitastor_prefix} : 'pve/'; die "illegal name '$name' - should be 'vm-$vmid-*'\n" if $name && $name !~ m/^vm-$vmid-/; @@ -266,21 +267,25 @@ sub free_image my $full_list = run_cli($scfg, [ 'ls', '-l' ]); my $list = _process_list($scfg, $storeid, $full_list); # Remove image and all its snapshots - my $to_remove = [ grep { $_->{name} eq $name || substr($_->{name}, 0, length($name)+1) eq ($name.'@') } @$list ]; - my $rm_names = { map { ($prefix.$_->{name} => 1) } @$to_remove }; - my $children = [ grep { $rm_names->{$_->{parent_name}} } @$full_list ]; + my $rm_names = { + map { ($prefix.$_->{name} => 1) } + grep { $_->{name} eq $name || substr($_->{name}, 0, length($name)+1) eq ($name.'@') } + @$list + }; + my $children = [ grep { $_->{parent_name} && $rm_names->{$_->{parent_name}} } @$full_list ]; die "Image has children: ".join(', ', map { substr($_->{name}, 0, length $prefix) eq $prefix ? substr($_->name, length $prefix) : $_->{name} - } @$children)."\n"; + } @$children)."\n" if @$children; + my $to_remove = [ grep { $rm_names->{$_->{name}} } @$full_list ]; for my $rmi (@$to_remove) { run_cli($scfg, [ 'rm-data', '--pool', $rmi->{pool_id}, '--inode', $rmi->{inode_num} ], json => 0); } for my $rmi (@$to_remove) { - run_cli($scfg, [ 'rm', $prefix.$rmi->{name} ], json => 0); + run_cli($scfg, [ 'rm', $rmi->{name} ], json => 0); } return undef; } @@ -297,8 +302,10 @@ sub _process_list next if $name =~ /@/; my ($owner) = $name =~ /^(?:vm|base)-(\d+)-/s; next if !defined $owner; - my $parent = $prefix eq '' || substr($el->{parent_name}, 0, length $prefix) eq $prefix - ? substr($el->{parent_name}, length $prefix) : ''; + my $parent = !defined $el->{parent_name} + ? undef + : ($prefix eq '' || substr($el->{parent_name}, 0, length $prefix) eq $prefix + ? substr($el->{parent_name}, length $prefix) : ''); my $volid = $parent && $parent =~ /^(base-\d+-\S+)$/s ? "$storeid:$1/$name" : "$storeid:$name"; push @$list, { @@ -316,7 +323,17 @@ sub _process_list sub list_images { my ($class, $storeid, $scfg, $vmid, $vollist, $cache) = @_; - return _process_list($scfg, $storeid, run_cli($scfg, [ 'ls', '-l' ])); + my $list = _process_list($scfg, $storeid, run_cli($scfg, [ 'ls', '-l' ])); + if ($vollist) + { + my $h = { map { ($_ => 1) } @$vollist }; + $list = [ grep { $h->{$_->{volid}} } @$list ] + } + elsif (defined $vmid) + { + $list = [ grep { $_->{vmid} eq $vmid } @$list ]; + } + return $list; } sub status @@ -408,7 +425,8 @@ sub volume_resize my ($class, $scfg, $storeid, $volname, $size, $running) = @_; my $prefix = defined $scfg->{vitastor_prefix} ? $scfg->{vitastor_prefix} : 'pve/'; my ($vtype, $name, $vmid) = $class->parse_volname($volname); - run_cli($scfg, [ 'modify', '--resize', (int(($size+3)/4)*4).'k', $prefix.$name ], json => 0); + # $size is in bytes in this method + run_cli($scfg, [ 'modify', '--resize', (int(($size+4095)/4096)*4).'k', $prefix.$name ], json => 0); return undef; }