fix get_active_super()/umount() race

This one needs restarts...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro
2010-03-22 20:15:33 -04:00
parent e7fe0585ca
commit 1494583de5

View File

@@ -471,17 +471,17 @@ struct super_block *get_active_super(struct block_device *bdev)
if (!bdev) if (!bdev)
return NULL; return NULL;
restart:
spin_lock(&sb_lock); spin_lock(&sb_lock);
list_for_each_entry(sb, &super_blocks, s_list) { list_for_each_entry(sb, &super_blocks, s_list) {
if (list_empty(&sb->s_instances)) if (list_empty(&sb->s_instances))
continue; continue;
if (sb->s_bdev != bdev) if (sb->s_bdev == bdev) {
continue; if (grab_super(sb)) /* drops sb_lock */
return sb;
if (grab_super(sb)) /* drops sb_lock */ else
return sb; goto restart;
}
spin_lock(&sb_lock);
} }
spin_unlock(&sb_lock); spin_unlock(&sb_lock);
return NULL; return NULL;