}
sub volume_rollback_is_possible {
- my ($cfg, $volid, $snap) = @_;
+ my ($cfg, $volid, $snap, $blockers) = @_;
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);
+ return $plugin->volume_rollback_is_possible($scfg, $storeid, $volname, $snap, $blockers);
} elsif ($volid =~ m|^(/.+)$| && -e $volid) {
die "snapshot rollback file/device '$volid' is not possible\n";
} else {
}
sub volume_rollback_is_possible {
- my ($class, $scfg, $storeid, $volname, $snap) = @_;
+ my ($class, $scfg, $storeid, $volname, $snap, $blockers) = @_;
return 1;
}
return undef;
}
+# Asserts that a rollback to $snap on $volname is possible.
+# If certain snapshots are preventing the rollback and $blockers is an array
+# reference, the snapshot names can be pushed onto $blockers prior to dying.
sub volume_rollback_is_possible {
- my ($class, $scfg, $storeid, $volname, $snap) = @_;
+ my ($class, $scfg, $storeid, $volname, $snap, $blockers) = @_;
return 1;
}
}
sub volume_rollback_is_possible {
- my ($class, $scfg, $storeid, $volname, $snap) = @_;
+ my ($class, $scfg, $storeid, $volname, $snap, $blockers) = @_;
# can't use '-S creation', because zfs list won't reverse the order when the
# creation time is the same second, breaking at least our tests.
my $snapshots = $class->zfs_get_sorted_snapshot_list($scfg, $volname, ['-s', 'creation']);
- my $recentsnap = $snapshots->[-1];
- die "can't rollback, no snapshots exist at all\n"
- if !defined($recentsnap);
+ my $found;
+ $blockers //= []; # not guaranteed to be set by caller
+ for my $snapshot ($snapshots->@*) {
+ if ($snapshot eq $snap) {
+ $found = 1;
+ } elsif ($found) {
+ push $blockers->@*, $snapshot;
+ }
+ }
+
+ my $volid = "${storeid}:${volname}";
+
+ die "can't rollback, snapshot '$snap' does not exist on '$volid'\n"
+ if !$found;
- die "can't rollback, '$snap' is not most recent snapshot\n"
- if $snap ne $recentsnap;
+ die "can't rollback, '$snap' is not most recent snapshot on '$volid'\n"
+ if scalar($blockers->@*) > 0;
return 1;
}