}
}
+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) = @_;
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) = @_;
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");
my ($class, $scfg, $storeid, $volname, $snap) = @_;
# abort rollback if snapshot is not the latest
+ $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 "cannot rollback, more recent snapshots exist\n";
+ die "can't rollback, more recent snapshots exist\n";
}
- zfs_request($class, $scfg, undef, 'rollback', "$scfg->{pool}/$volname\@$snap");
+ return 1;
}
sub activate_storage {