diff options
Diffstat (limited to 'fs/super.c')
| -rw-r--r-- | fs/super.c | 9 | 
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/super.c b/fs/super.c index 5fa9a8d8d865..122c402049a2 100644 --- a/fs/super.c +++ b/fs/super.c @@ -167,6 +167,7 @@ static void destroy_unused_super(struct super_block *s)  	security_sb_free(s);  	put_user_ns(s->s_user_ns);  	kfree(s->s_subtype); +	free_prealloced_shrinker(&s->s_shrink);  	/* no delays needed */  	destroy_super_work(&s->destroy_work);  } @@ -252,6 +253,8 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags,  	s->s_shrink.count_objects = super_cache_count;  	s->s_shrink.batch = 1024;  	s->s_shrink.flags = SHRINKER_NUMA_AWARE | SHRINKER_MEMCG_AWARE; +	if (prealloc_shrinker(&s->s_shrink)) +		goto fail;  	return s;  fail: @@ -518,11 +521,7 @@ retry:  	hlist_add_head(&s->s_instances, &type->fs_supers);  	spin_unlock(&sb_lock);  	get_filesystem(type); -	err = register_shrinker(&s->s_shrink); -	if (err) { -		deactivate_locked_super(s); -		s = ERR_PTR(err); -	} +	register_shrinker_prepared(&s->s_shrink);  	return s;  }  |