summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchrisrd <chris@onthe.net.au>2022-01-05 12:07:33 +1100
committerTony Hutter <hutter2@llnl.gov>2022-02-03 15:28:01 -0800
commit1259dc6e6a8387c4302f73077f6dbeb3f2e4be13 (patch)
tree52d91ac754807b14ddf70ce08a263d2134317728
parent6575defc527ff78d2754f0d95815ea995724c2b2 (diff)
zfs_prune: reset sc.nr_to_scan
sc.nr_to_scan is an input to super_cache_clean (via shrinker->scan_objects), used to set the number of objects to scan in the various caches. However super_cache_scan also modifies sc.nr_to_scan, so when used in a loop we need to reset sc.nr_to_scan back to our desired nr_to_scan for the next iteration. Issue discovered and solution suggested by Tenzin Lhakhang @tlhakhan. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Chris Dunlop <chris@onthe.net.au> Issue #12433 Closes #12908
-rw-r--r--module/os/linux/zfs/zfs_vfsops.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/module/os/linux/zfs/zfs_vfsops.c b/module/os/linux/zfs/zfs_vfsops.c
index 5d672af0e..469b82efe 100644
--- a/module/os/linux/zfs/zfs_vfsops.c
+++ b/module/os/linux/zfs/zfs_vfsops.c
@@ -1259,6 +1259,11 @@ zfs_prune(struct super_block *sb, unsigned long nr_to_scan, int *objects)
*objects = 0;
for_each_online_node(sc.nid) {
*objects += (*shrinker->scan_objects)(shrinker, &sc);
+ /*
+ * reset sc.nr_to_scan, modified by
+ * scan_objects == super_cache_scan
+ */
+ sc.nr_to_scan = nr_to_scan;
}
} else {
*objects = (*shrinker->scan_objects)(shrinker, &sc);