summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/super.c19
1 files changed, 3 insertions, 16 deletions
diff --git a/fs/super.c b/fs/super.c
index 156eae5ed50..d8c8b1d2d01 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -487,22 +487,9 @@ struct super_block *get_active_super(struct block_device *bdev)
if (sb->s_bdev != bdev)
continue;
- sb->s_count++;
- spin_unlock(&sb_lock);
- down_write(&sb->s_umount);
- if (sb->s_root) {
- spin_lock(&sb_lock);
- if (sb->s_count > S_BIAS) {
- atomic_inc(&sb->s_active);
- sb->s_count--;
- spin_unlock(&sb_lock);
- return sb;
- }
- spin_unlock(&sb_lock);
- }
- up_write(&sb->s_umount);
- put_super(sb);
- yield();
+ if (grab_super(sb)) /* drops sb_lock */
+ return sb;
+
spin_lock(&sb_lock);
}
spin_unlock(&sb_lock);