summaryrefslogtreecommitdiffstats
path: root/fs/super.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2017-10-11 13:48:55 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2017-10-11 13:56:37 -0400
commitc645b9309839be3f1543255db2abfe120f9d4f26 (patch)
treea514eeb19fafbdaeb05ee3ed7a50e3226d21a27a /fs/super.c
parent0200894d11551a8abcff7872c2260d0801951f67 (diff)
downloadlinux-c645b9309839be3f1543255db2abfe120f9d4f26.tar.gz
linux-c645b9309839be3f1543255db2abfe120f9d4f26.tar.bz2
linux-c645b9309839be3f1543255db2abfe120f9d4f26.zip
fold destroy_super() into __put_super()
There's only one caller of destroy_super() left now. Fold it there, and replace those list_lru_destroy() calls with checks that they had already been done (as they should have, when we were dropping the last active reference). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/super.c')
-rw-r--r--fs/super.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/fs/super.c b/fs/super.c
index 01b7e3fd09e8..8ca15415351a 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -154,23 +154,6 @@ static void destroy_super_rcu(struct rcu_head *head)
schedule_work(&s->destroy_work);
}
-/**
- * destroy_super - frees a superblock
- * @s: superblock to free
- *
- * Frees a superblock.
- */
-static void destroy_super(struct super_block *s)
-{
- list_lru_destroy(&s->s_dentry_lru);
- list_lru_destroy(&s->s_inode_lru);
- security_sb_free(s);
- WARN_ON(!list_empty(&s->s_mounts));
- put_user_ns(s->s_user_ns);
- kfree(s->s_subtype);
- call_rcu(&s->rcu, destroy_super_rcu);
-}
-
/* Free a superblock that has never been seen by anyone */
static void destroy_unused_super(struct super_block *s)
{
@@ -280,11 +263,17 @@ fail:
/*
* Drop a superblock's refcount. The caller must hold sb_lock.
*/
-static void __put_super(struct super_block *sb)
+static void __put_super(struct super_block *s)
{
- if (!--sb->s_count) {
- list_del_init(&sb->s_list);
- destroy_super(sb);
+ if (!--s->s_count) {
+ list_del_init(&s->s_list);
+ WARN_ON(s->s_dentry_lru.node);
+ WARN_ON(s->s_inode_lru.node);
+ WARN_ON(!list_empty(&s->s_mounts));
+ security_sb_free(s);
+ put_user_ns(s->s_user_ns);
+ kfree(s->s_subtype);
+ call_rcu(&s->rcu, destroy_super_rcu);
}
}