Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
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);