From 26a8f21ab23c9e745e207ea48aa1b27f7f8f7ed4 Mon Sep 17 00:00:00 2001 From: Dominik Csapak Date: Thu, 21 Jan 2021 16:47:59 +0100 Subject: [PATCH] add workaround for zfs rollback bug as described in the zfs bug https://github.com/openzfs/zfs/issues/10931 the kernel keeps around cached data from mmaps after a rollback, thus having invalid data in files that were allegedly rolled back to workaround this (until a real fix comes along), we unmount the subvol, invalidating the kernel cache anyway the dataset gets mounted on the next 'activate_volume' again Signed-off-by: Dominik Csapak --- PVE/Storage/ZFSPoolPlugin.pm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/PVE/Storage/ZFSPoolPlugin.pm b/PVE/Storage/ZFSPoolPlugin.pm index 3054331..105d802 100644 --- a/PVE/Storage/ZFSPoolPlugin.pm +++ b/PVE/Storage/ZFSPoolPlugin.pm @@ -467,9 +467,18 @@ sub volume_snapshot_delete { sub volume_snapshot_rollback { my ($class, $scfg, $storeid, $volname, $snap) = @_; - my $vname = ($class->parse_volname($volname))[1]; + my (undef, $vname, undef, undef, undef, undef, $format) = $class->parse_volname($volname); - $class->zfs_request($scfg, undef, 'rollback', "$scfg->{pool}/$vname\@$snap"); + my $msg = $class->zfs_request($scfg, undef, 'rollback', "$scfg->{pool}/$vname\@$snap"); + + # we have to unmount rollbacked subvols, to invalidate wrong kernel + # caches, they get mounted in activate volume again + # see zfs bug #10931 https://github.com/openzfs/zfs/issues/10931 + if ($format eq 'subvol') { + $class->zfs_request($scfg, undef, 'unmount', "$scfg->{pool}/$vname"); + } + + return $msg; } sub volume_rollback_is_possible {