[PATCH pve-storage 9/9] storage: add volume_support_qemu_snapshot

Alexandre Derumier alexandre.derumier at groupe-cyllene.com
Tue Jun 3 09:55:54 CEST 2025


Returns if the volume is supporting qemu snapshot:
 'internal' : do the snapshot with qemu internal snapshot
 'external' : do the snapshot with qemu external snapshot
  undef     : does not support qemu snapshot

Signed-off-by: Alexandre Derumier <alexandre.derumier at groupe-cyllene.com>
---
 src/PVE/Storage.pm           | 15 +++++++++++++++
 src/PVE/Storage/DirPlugin.pm | 10 ++++++++++
 src/PVE/Storage/LVMPlugin.pm |  7 +++++++
 src/PVE/Storage/Plugin.pm    | 20 ++++++++++++++++++++
 src/PVE/Storage/RBDPlugin.pm |  6 ++++++
 5 files changed, 58 insertions(+)

diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm
index 2a2005b..413ad0c 100755
--- a/src/PVE/Storage.pm
+++ b/src/PVE/Storage.pm
@@ -2145,6 +2145,21 @@ sub rename_volume {
     });
 }
 
+sub volume_support_qemu_snapshot {
+    my ($cfg, $volid) = @_;
+
+    my ($storeid, $volname) = parse_volume_id($volid, 1);
+
+    if ($storeid) {
+	my $scfg = storage_config($cfg, $storeid);
+
+	my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+
+	return $plugin->volume_support_qemu_snapshot($storeid, $scfg, $volname);
+    }
+    return undef;
+}
+
 # Various io-heavy operations require io/bandwidth limits which can be
 # configured on multiple levels: The global defaults in datacenter.cfg, and
 # per-storage overrides. When we want to do a restore from storage A to storage
diff --git a/src/PVE/Storage/DirPlugin.pm b/src/PVE/Storage/DirPlugin.pm
index 54d8d74..3287fde 100644
--- a/src/PVE/Storage/DirPlugin.pm
+++ b/src/PVE/Storage/DirPlugin.pm
@@ -302,4 +302,14 @@ sub get_import_metadata {
     };
 }
 
+sub volume_support_qemu_snapshot {
+    my ($class, $storeid, $scfg, $volname) = @_;
+
+    my $format = ($class->parse_volname($volname))[6];
+    return if $format ne 'qcow2';
+
+    my $type = $scfg->{snapext} ? 'external' : 'internal';
+    return $type;
+}
+
 1;
diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm
index af50b91..3ba2f0f 100644
--- a/src/PVE/Storage/LVMPlugin.pm
+++ b/src/PVE/Storage/LVMPlugin.pm
@@ -1065,4 +1065,11 @@ sub get_snap_volname {
     return $class->get_snap_name($volname, $snapname);
 }
 
+sub volume_support_qemu_snapshot {
+    my ($class, $storeid, $scfg, $volname) = @_;
+
+    my $format = ($class->parse_volname($volname))[6];
+    return 'external' if $format eq 'qcow2';
+}
+
 1;
diff --git a/src/PVE/Storage/Plugin.pm b/src/PVE/Storage/Plugin.pm
index fd50b9e..6bdd9c6 100644
--- a/src/PVE/Storage/Plugin.pm
+++ b/src/PVE/Storage/Plugin.pm
@@ -2113,6 +2113,26 @@ sub new_backup_provider {
     die "implement me if enabling the feature 'backup-provider' in plugindata()->{features}\n";
 }
 
+=pod
+
+=head3 volume_support_qemu_snapshot
+
+    $blockdev = $plugin->volume_support_qemu_snapshot($storeid, $scfg, $volname)
+
+Returns a string with the type of snapshot that qemu can do for a specific volume
+
+'internal' : support snapshot with qemu internal snapshot
+'external' : support snapshot with qemu external snapshot
+undef      : don't support qemu snapshot
+=cut
+
+sub volume_support_qemu_snapshot {
+    my ($class, $storeid, $scfg, $volname) = @_;
+
+    my $format = ($class->parse_volname($volname))[6];
+    return 'internal' if $format eq 'qcow2';
+}
+
 sub config_aware_base_mkdir {
     my ($class, $scfg, $path) = @_;
 
diff --git a/src/PVE/Storage/RBDPlugin.pm b/src/PVE/Storage/RBDPlugin.pm
index afed2be..88227bd 100644
--- a/src/PVE/Storage/RBDPlugin.pm
+++ b/src/PVE/Storage/RBDPlugin.pm
@@ -1039,4 +1039,10 @@ sub rename_volume {
     return "${storeid}:${base_name}${target_volname}";
 }
 
+sub volume_support_qemu_snapshot {
+    my ($class, $storeid, $scfg, $volname) = @_;
+
+    return 'internal' if !$scfg->{krbd};
+}
+
 1;
-- 
2.39.5




More information about the pve-devel mailing list