If the $follow_backing_files parameter is set for qemu_img_info(), it
will always return an array reference.

For the implementation in Plugin.pm it will thus be detected as a
volume chain even if the 'snapshot-as-volume-chain' storage
configuration option is not used. Fix this, by relying on the storage
configuration option. Flip the branches to avoid the need to negate
the condition.

For the implementation in LVMPlugin.pm, do not call qemu-img if the
'snapshot-as-volume-chain' storage configuration option is not used.

Signed-off-by: Fiona Ebner <[email protected]>
---
 src/PVE/Storage/LVMPlugin.pm |  4 ++--
 src/PVE/Storage/Plugin.pm    | 23 ++++++++++++-----------
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm
index 65e0ffa..1e52df3 100644
--- a/src/PVE/Storage/LVMPlugin.pm
+++ b/src/PVE/Storage/LVMPlugin.pm
@@ -868,6 +868,8 @@ sub status {
 sub volume_snapshot_info {
     my ($class, $scfg, $storeid, $volname) = @_;
 
+    return {} if !$scfg->{'snapshot-as-volume-chain'};
+
     my $short_volname = ($class->parse_volname($volname))[1];
 
     my $get_snapname_from_path = sub {
@@ -892,9 +894,7 @@ sub volume_snapshot_info {
     }
     my $info = {};
     my $order = 0;
-    return $info if ref($json_decode) ne 'ARRAY';
 
-    #no snapshot or external  snapshots is an arrayref
     my $snapshots = $json_decode;
     for my $snap (@$snapshots) {
         my $snapfile = $snap->{filename};
diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index 1fc2b8f..6fb4b98 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -1903,7 +1903,8 @@ sub volume_snapshot_info {
     my ($vtype, $name, $vmid, $basename, $basevmid, $isBase, $format) =
         $class->parse_volname($volname);
 
-    my $json = PVE::Storage::Common::qemu_img_info($path, undef, 10, 1);
+    my $json =
+        PVE::Storage::Common::qemu_img_info($path, undef, 10, 
$scfg->{'snapshot-as-volume-chain'});
     die "failed to query file information with qemu-img\n" if !$json;
     my $json_decode = eval { decode_json($json) };
     if ($@) {
@@ -1911,16 +1912,8 @@ sub volume_snapshot_info {
     }
     my $info = {};
     my $order = 0;
-    if (ref($json_decode) eq 'HASH') {
-        #internal snapshots is a hashref
-        my $snapshots = $json_decode->{snapshots};
-        for my $snap (@$snapshots) {
-            my $snapname = $snap->{name};
-            $info->{$snapname}->{timestamp} = $snap->{'date-sec'};
-
-        }
-    } elsif (ref($json_decode) eq 'ARRAY') {
-        #no snapshot or external  snapshots is an arrayref
+    if ($scfg->{'snapshot-as-volume-chain'}) {
+        # calling qemu_img_info() with $follow_backing_files gives an array 
reference
         my $snapshots = $json_decode;
         for my $snap (@$snapshots) {
             my $snapfile = $snap->{filename};
@@ -1947,6 +1940,14 @@ sub volume_snapshot_info {
             }
             $order++;
         }
+    } else {
+        # calling qemu_img_info() without $follow_backing_files gives a single 
hash reference
+        my $snapshots = $json_decode->{snapshots};
+        for my $snap (@$snapshots) {
+            my $snapname = $snap->{name};
+            $info->{$snapname}->{timestamp} = $snap->{'date-sec'};
+
+        }
     }
 
     return $info;
-- 
2.47.3



_______________________________________________
pve-devel mailing list
[email protected]
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to