Smack: File receive audit correction
[pandora-kernel.git] / fs / super.c
index 8aa2660..3a96c97 100644 (file)
@@ -76,28 +76,28 @@ static unsigned long super_cache_scan(struct shrinker *shrink,
                return SHRINK_STOP;
 
        if (sb->s_op->nr_cached_objects)
-               fs_objects = sb->s_op->nr_cached_objects(sb);
+               fs_objects = sb->s_op->nr_cached_objects(sb, sc->nid);
 
-       total_objects = sb->s_nr_dentry_unused +
-                       sb->s_nr_inodes_unused + fs_objects + 1;
+       inodes = list_lru_count_node(&sb->s_inode_lru, sc->nid);
+       dentries = list_lru_count_node(&sb->s_dentry_lru, sc->nid);
+       total_objects = dentries + inodes + fs_objects + 1;
 
        /* proportion the scan between the caches */
-       dentries = mult_frac(sc->nr_to_scan, sb->s_nr_dentry_unused,
-                                                               total_objects);
-       inodes = mult_frac(sc->nr_to_scan, sb->s_nr_inodes_unused,
-                                                               total_objects);
+       dentries = mult_frac(sc->nr_to_scan, dentries, total_objects);
+       inodes = mult_frac(sc->nr_to_scan, inodes, total_objects);
 
        /*
         * prune the dcache first as the icache is pinned by it, then
         * prune the icache, followed by the filesystem specific caches
         */
-       freed = prune_dcache_sb(sb, dentries);
-       freed += prune_icache_sb(sb, inodes);
+       freed = prune_dcache_sb(sb, dentries, sc->nid);
+       freed += prune_icache_sb(sb, inodes, sc->nid);
 
        if (fs_objects) {
                fs_objects = mult_frac(sc->nr_to_scan, fs_objects,
                                                                total_objects);
-               freed += sb->s_op->free_cached_objects(sb, fs_objects);
+               freed += sb->s_op->free_cached_objects(sb, fs_objects,
+                                                      sc->nid);
        }
 
        drop_super(sb);
@@ -116,10 +116,13 @@ static unsigned long super_cache_count(struct shrinker *shrink,
                return 0;
 
        if (sb->s_op && sb->s_op->nr_cached_objects)
-               total_objects = sb->s_op->nr_cached_objects(sb);
+               total_objects = sb->s_op->nr_cached_objects(sb,
+                                                sc->nid);
 
-       total_objects += sb->s_nr_dentry_unused;
-       total_objects += sb->s_nr_inodes_unused;
+       total_objects += list_lru_count_node(&sb->s_dentry_lru,
+                                                sc->nid);
+       total_objects += list_lru_count_node(&sb->s_inode_lru,
+                                                sc->nid);
 
        total_objects = vfs_pressure_ratio(total_objects);
        drop_super(sb);
@@ -192,10 +195,12 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)
                INIT_HLIST_NODE(&s->s_instances);
                INIT_HLIST_BL_HEAD(&s->s_anon);
                INIT_LIST_HEAD(&s->s_inodes);
-               INIT_LIST_HEAD(&s->s_dentry_lru);
-               spin_lock_init(&s->s_dentry_lru_lock);
-               INIT_LIST_HEAD(&s->s_inode_lru);
-               spin_lock_init(&s->s_inode_lru_lock);
+
+               if (list_lru_init(&s->s_dentry_lru))
+                       goto err_out;
+               if (list_lru_init(&s->s_inode_lru))
+                       goto err_out_dentry_lru;
+
                INIT_LIST_HEAD(&s->s_mounts);
                init_rwsem(&s->s_umount);
                lockdep_set_class(&s->s_umount, &type->s_umount_key);
@@ -231,9 +236,13 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags)
                s->s_shrink.scan_objects = super_cache_scan;
                s->s_shrink.count_objects = super_cache_count;
                s->s_shrink.batch = 1024;
+               s->s_shrink.flags = SHRINKER_NUMA_AWARE;
        }
 out:
        return s;
+
+err_out_dentry_lru:
+       list_lru_destroy(&s->s_dentry_lru);
 err_out:
        security_sb_free(s);
 #ifdef CONFIG_SMP
@@ -314,6 +323,9 @@ void deactivate_locked_super(struct super_block *s)
 
                /* caches are now gone, we can safely kill the shrinker now */
                unregister_shrinker(&s->s_shrink);
+               list_lru_destroy(&s->s_dentry_lru);
+               list_lru_destroy(&s->s_inode_lru);
+
                put_filesystem(fs);
                put_super(s);
        } else {