[PATCH pve-storage v1 11/54] plugin: use closure for obtaining raw volume data in list_volumes

Max R. Carrara
2026-04-22T11:15:07Z

To make the code in the `list_volumes()` API method a little more
readable and maintainable, break up the if-elsif chain that obtains
the raw volume data into a closure. The overall logic is kept the
same.

Also rename `$data` to `$raw_volumes` to make it a little clearer what
is actually being iterated over, since "data" does not really say
much.

Be a little more specific and use an un-definedness check on
`$raw_volumes` to continue with the iteration, instead of a plain
negation.

Signed-off-by: Max R. Carrara <m.carrara@proxmox.com>
---
src/PVE/Storage/Plugin.pm | 51 ++++++++++++++++++++++++++-------------
1 file changed, 34 insertions(+), 17 deletions(-)

diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index d2e6e9df..106cff6f 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -1787,28 +1787,45 @@ sub list_volumes {

my $res = [];
my $vmlist = PVE::Cluster::get_vmlist();
- for my $type ($content_types->@*) {
- my $data;
+
+ my $get_raw_volumes_for_type = sub {
+ my ($type) = @_;

if ($type eq 'images' || $type eq 'rootdir') {
- $data = $class->list_images($storeid, $scfg, $vmid);
- } elsif ($scfg->{path}) {
- if ($type eq 'iso' && !defined($vmid)) {
- $data = get_subdir_files($storeid, $scfg, 'iso', undef);
- } elsif ($type eq 'vztmpl' && !defined($vmid)) {
- $data = get_subdir_files($storeid, $scfg, 'vztmpl', undef);
- } elsif ($type eq 'backup') {
- $data = get_subdir_files($storeid, $scfg, 'backup', $vmid);
- } elsif ($type eq 'snippets') {
- $data = get_subdir_files($storeid, $scfg, 'snippets', undef);
- } elsif ($type eq 'import') {
- $data = get_subdir_files($storeid, $scfg, 'import', undef);
- }
+ return $class->list_images($storeid, $scfg, $vmid);
}

- next if !$data;
+ return if !$scfg->{path};

- for my $item ($data->@*) {
+ if ($type eq 'iso' && !defined($vmid)) {
+ return get_subdir_files($storeid, $scfg, 'iso', undef);
+ }
+
+ if ($type eq 'vztmpl' && !defined($vmid)) {
+ return get_subdir_files($storeid, $scfg, 'vztmpl', undef);
+ }
+
+ if ($type eq 'backup') {
+ return get_subdir_files($storeid, $scfg, 'backup', $vmid);
+ }
+
+ if ($type eq 'snippets') {
+ return get_subdir_files($storeid, $scfg, 'snippets', undef);
+ }
+
+ if ($type eq 'import') {
+ return get_subdir_files($storeid, $scfg, 'import', undef);
+ }
+
+ return;
+ };
+
+ for my $type ($content_types->@*) {
+ my $raw_volumes = $get_raw_volumes_for_type->($type);
+
+ next if !defined($raw_volumes);
+
+ for my $item ($raw_volumes->@*) {
if ($type eq 'images' || $type eq 'rootdir') {
my $vminfo = $vmlist->{ids}->{ $item->{vmid} };
my $vmtype;
--
2.47.3