]> granicus.if.org Git - zfs/commitdiff
Linux 3.12 compat: split shrinker has s_shrink
authorTim Chase <tim@chase2k.com>
Thu, 18 Dec 2014 16:08:47 +0000 (10:08 -0600)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 20 Jan 2015 22:07:59 +0000 (14:07 -0800)
The split count/scan shrinker callbacks introduced in 3.12 broke the
test for HAVE_SHRINK, effectively disabling the per-superblock shrinkers.

This patch re-enables the per-superblock shrinkers when the split shrinker
callbacks have been detected.

Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #2975

module/zfs/zfs_vfsops.c
module/zfs/zpl_super.c

index d29fc6560a8f7e0c90ebb263677168298c114ce4..a2dea89b7f66b04eaea2a5d055b61859af7a4d72 100644 (file)
@@ -1068,7 +1068,7 @@ zfs_root(zfs_sb_t *zsb, struct inode **ipp)
 }
 EXPORT_SYMBOL(zfs_root);
 
-#ifdef HAVE_SHRINK
+#if defined(HAVE_SHRINK) || defined(HAVE_SPLIT_SHRINKER_CALLBACK)
 int
 zfs_sb_prune(struct super_block *sb, unsigned long nr_to_scan, int *objects)
 {
@@ -1080,13 +1080,17 @@ zfs_sb_prune(struct super_block *sb, unsigned long nr_to_scan, int *objects)
        };
 
        ZFS_ENTER(zsb);
+#ifdef HAVE_SPLIT_SHRINKER_CALLBACK
+       *objects = (*shrinker->scan_objects)(shrinker, &sc);
+#else
        *objects = (*shrinker->shrink)(shrinker, &sc);
+#endif
        ZFS_EXIT(zsb);
 
        return (0);
 }
 EXPORT_SYMBOL(zfs_sb_prune);
-#endif /* HAVE_SHRINK */
+#endif /* defined(HAVE_SHRINK) || defined(HAVE_SPLIT_SHRINKER_CALLBACK) */
 
 /*
  * Teardown the zfs_sb_t.
index 410030461dedae9d090462de8504fef85b4e6fb6..aa234bcff6da2d5bdb3db88c9697e0ecff79bf3d 100644 (file)
@@ -268,7 +268,7 @@ zpl_kill_sb(struct super_block *sb)
 #endif /* HAVE_S_INSTANCES_LIST_HEAD */
 }
 
-#ifdef HAVE_SHRINK
+#if defined(HAVE_SHRINK) || defined(HAVE_SPLIT_SHRINKER_CALLBACK)
 /*
  * Linux 3.1 - 3.x API
  *
@@ -288,17 +288,17 @@ zpl_prune_sb(struct super_block *sb, void *arg)
        error = -zfs_sb_prune(sb, *(unsigned long *)arg, &objects);
        ASSERT3S(error, <=, 0);
 }
-#endif /* HAVE_SHRINK */
+#endif /* defined(HAVE_SHRINK) || defined(HAVE_SPLIT_SHRINKER_CALLBACK) */
 
 void
 zpl_prune_sbs(int64_t bytes_to_scan, void *private)
 {
-#ifdef HAVE_SHRINK
+#if defined(HAVE_SHRINK) || defined(HAVE_SPLIT_SHRINKER_CALLBACK)
        unsigned long nr_to_scan = (bytes_to_scan / sizeof (znode_t));
 
        iterate_supers_type(&zpl_fs_type, zpl_prune_sb, &nr_to_scan);
        kmem_reap();
-#endif /* HAVE_SHRINK */
+#endif /* defined(HAVE_SHRINK) || defined(HAVE_SPLIT_SHRINKER_CALLBACK) */
 }
 
 #ifdef HAVE_NR_CACHED_OBJECTS