--- x/fs/super.c +++ y/fs/super.c @@ -286,6 +286,7 @@ static void __put_super(struct super_blo { if (!--s->s_count) { list_del_init(&s->s_list); + hlist_del_init(&s->s_instances); WARN_ON(s->s_dentry_lru.node); WARN_ON(s->s_inode_lru.node); WARN_ON(!list_empty(&s->s_mounts)); @@ -380,9 +381,13 @@ EXPORT_SYMBOL(deactivate_super); static int grab_super(struct super_block *s) __releases(sb_lock) { s->s_count++; + if (!atomic_inc_not_zero(&s->s_active)) { + spin_unlock(&sb_lock); + return 0; + } spin_unlock(&sb_lock); down_write(&s->s_umount); - if ((s->s_flags & SB_BORN) && atomic_inc_not_zero(&s->s_active)) { + if (s->s_flags & SB_BORN) { put_super(s); return 1; }