Skip to content

Commit

Permalink
In get_super() and user_get_super() restarts are unconditional
Browse files Browse the repository at this point in the history
If superblock had been still alive, we would've returned it...

Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
Al Viro committed May 21, 2010
1 parent 1494583 commit df40c01
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions fs/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -425,7 +425,7 @@ void sync_supers(void)
* mounted on the device given. %NULL is returned if no match is found.
*/

struct super_block * get_super(struct block_device *bdev)
struct super_block *get_super(struct block_device *bdev)
{
struct super_block *sb;

Expand All @@ -441,13 +441,14 @@ struct super_block * get_super(struct block_device *bdev)
sb->s_count++;
spin_unlock(&sb_lock);
down_read(&sb->s_umount);
/* still alive? */
if (sb->s_root)
return sb;
up_read(&sb->s_umount);
/* restart only when sb is no longer on the list */
/* nope, got unmounted */
spin_lock(&sb_lock);
if (__put_super_and_need_restart(sb))
goto rescan;
__put_super(sb);
goto rescan;
}
}
spin_unlock(&sb_lock);
Expand Down Expand Up @@ -487,7 +488,7 @@ struct super_block *get_active_super(struct block_device *bdev)
return NULL;
}

struct super_block * user_get_super(dev_t dev)
struct super_block *user_get_super(dev_t dev)
{
struct super_block *sb;

Expand All @@ -500,13 +501,14 @@ struct super_block * user_get_super(dev_t dev)
sb->s_count++;
spin_unlock(&sb_lock);
down_read(&sb->s_umount);
/* still alive? */
if (sb->s_root)
return sb;
up_read(&sb->s_umount);
/* restart only when sb is no longer on the list */
/* nope, got unmounted */
spin_lock(&sb_lock);
if (__put_super_and_need_restart(sb))
goto rescan;
__put_super(sb);
goto rescan;
}
}
spin_unlock(&sb_lock);
Expand Down

0 comments on commit df40c01

Please sign in to comment.