[Devel] [PATCH rh7] fs/superblock: apply d23da150a37c correctly

Andrey Ryabinin aryabinin at virtuozzo.com
Tue Dec 29 03:28:24 PST 2015


It seems that commit d23da150a37c ("fs/superblock: avoid locking
   counting inodes and dentries before reclaiming them")
wasn't applied correctly durring rebase to RHEL 7.2.
Fix this up.

https://bugs.openvz.org/browse/OVZ-6646

Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>
---
 fs/super.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/fs/super.c b/fs/super.c
index 909d943..d09e15a 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -73,6 +73,9 @@ static unsigned long super_cache_scan(struct shrinker *shrink,
 	if (!(sc->gfp_mask & __GFP_FS))
 		return SHRINK_STOP;
 
+	if (!grab_super_passive(sb))
+                return SHRINK_STOP;
+
 	if (sb->s_op && sb->s_op->nr_cached_objects)
 		fs_objects = sb->s_op->nr_cached_objects(sb, sc);
 
@@ -111,9 +114,14 @@ static unsigned long super_cache_count(struct shrinker *shrink,
 
 	sb = container_of(shrink, struct super_block, s_shrink);
 
-	if (!grab_super_passive(sb))
-		return 0;
-
+	/*
+	 * Don't call grab_super_passive as it is a potential
+	 * scalability bottleneck. The counts could get updated
+	 * between super_cache_count and super_cache_scan anyway.
+	 * Call to super_cache_count with shrinker_rwsem held
+	 * ensures the safety of call to list_lru_count_node() and
+	 * s_op->nr_cached_objects().
+	 */
 	if (sb->s_op && sb->s_op->nr_cached_objects)
 		total_objects = sb->s_op->nr_cached_objects(sb, sc);
 
-- 
2.4.10



More information about the Devel mailing list