diff --git a/PVE/Storage.pm b/PVE/Storage.pm index 8711710..7845ad1 100755 --- a/PVE/Storage.pm +++ b/PVE/Storage.pm @@ -144,6 +144,21 @@ sub volume_resize { } } +sub volume_rollback_is_possible { + my ($cfg, $volid, $snap) = @_; + + 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_rollback_is_possible($scfg, $storeid, $volname, $snap); + } elsif ($volid =~ m|^(/.+)$| && -e $volid) { + die "snapshot rollback device $volid is not possible"; + } else { + die "can't parse volume id"; + } +} + sub volume_snapshot { my ($cfg, $volid, $snap, $running) = @_; diff --git a/PVE/Storage/Plugin.pm b/PVE/Storage/Plugin.pm index 15c23d4..3eb99f2 100644 --- a/PVE/Storage/Plugin.pm +++ b/PVE/Storage/Plugin.pm @@ -656,6 +656,12 @@ sub volume_snapshot { return undef; } +sub volume_rollback_is_possible { + my ($class, $scfg, $storeid, $volname, $snap) = @_; + + return 1; +} + sub volume_snapshot_rollback { my ($class, $scfg, $storeid, $volname, $snap) = @_; diff --git a/PVE/Storage/ZFSPlugin.pm b/PVE/Storage/ZFSPlugin.pm index 77394b9..6aac58d 100644 --- a/PVE/Storage/ZFSPlugin.pm +++ b/PVE/Storage/ZFSPlugin.pm @@ -311,11 +311,8 @@ sub volume_snapshot_rollback { my ($class, $scfg, $storeid, $volname, $snap) = @_; # abort rollback if snapshot is not the latest - my $recentsnap = $class->zfs_get_latest_snapshot($scfg, $volname); - if ($snap ne $recentsnap) { - die "cannot rollback, more recent snapshots exist\n"; - } - + $class->volume_rollback_is_possible($scfg, $storeid, $volname, $snap); + $class->zfs_delete_lu($scfg, $volname); $class->zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap"); diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm index 754f29f..2a1cfef 100644 --- a/PVE/Storage/ZFSPoolPlugin.pm +++ b/PVE/Storage/ZFSPoolPlugin.pm @@ -412,14 +412,22 @@ sub volume_snapshot_rollback { my ($class, $scfg, $storeid, $volname, $snap) = @_; # abort rollback if snapshot is not the latest - my $recentsnap = $class->zfs_get_latest_snapshot($scfg, $volname); - if ($snap ne $recentsnap) { - die "cannot rollback, more recent snapshots exist\n"; - } + $class->volume_rollback_is_possible($scfg, $storeid, $volname, $snap); zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap"); } +sub volume_rollback_is_possible { + my ($class, $scfg, $storeid, $volname, $snap) = @_; + + my $recentsnap = $class->zfs_get_latest_snapshot($scfg, $volname); + if ($snap ne $recentsnap) { + die "can't rollback, more recent snapshots exist\n"; + } + + return 1; +} + sub activate_storage { my ($class, $storeid, $scfg, $cache) = @_;