diff --git a/ApiChangeLog b/ApiChangeLog index 12eef1f..68e94fd 100644 --- a/ApiChangeLog +++ b/ApiChangeLog @@ -29,6 +29,14 @@ Future changes should be documented in here. * Introduce rename_snapshot() plugin method This method allow to rename a vm disk snapshot name to a different snapshot name. +* Introduce volume_support_qemu_snapshot() plugin method + This method is used to known if the a snapshot need to be done by qemu + or by the storage api. + returned values are : + 'internal' : support snapshot with qemu internal snapshot + 'external' : support snapshot with qemu external snapshot + undef : don't support qemu snapshot + ## Version 11: * Allow declaring storage features via plugin data diff --git a/src/PVE/Storage.pm b/src/PVE/Storage.pm index e0b79fa..b796908 100755 --- a/src/PVE/Storage.pm +++ b/src/PVE/Storage.pm @@ -2370,6 +2370,21 @@ sub rename_snapshot { ); } +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 10e4f70..3e92383 100644 --- a/src/PVE/Storage/DirPlugin.pm +++ b/src/PVE/Storage/DirPlugin.pm @@ -314,4 +314,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->{'external-snapshots'} ? 'external' : 'internal'; + return $type; +} + 1; diff --git a/src/PVE/Storage/LVMPlugin.pm b/src/PVE/Storage/LVMPlugin.pm index 96ce893..c861ba6 100644 --- a/src/PVE/Storage/LVMPlugin.pm +++ b/src/PVE/Storage/LVMPlugin.pm @@ -872,4 +872,11 @@ sub rename_snapshot { die "rename_snapshot is not implemented for $class"; } +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 6b2dc32..aab2024 100644 --- a/src/PVE/Storage/Plugin.pm +++ b/src/PVE/Storage/Plugin.pm @@ -2262,6 +2262,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 8ad4246..01866f1 100644 --- a/src/PVE/Storage/RBDPlugin.pm +++ b/src/PVE/Storage/RBDPlugin.pm @@ -1063,4 +1063,10 @@ sub rename_snapshot { die "rename_snapshot is not implemented for $class"; } +sub volume_support_qemu_snapshot { + my ($class, $storeid, $scfg, $volname) = @_; + + return 'internal' if !$scfg->{krbd}; +} + 1;