fix do_emergency_remount()/umount() races
need list_for_each_entry_safe() here. Original didn't even have restart logics, so if you race with umount() it blew up. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
6754af6464
commit
e7fe0585ca
@ -602,10 +602,10 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force)
|
|||||||
|
|
||||||
static void do_emergency_remount(struct work_struct *work)
|
static void do_emergency_remount(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct super_block *sb;
|
struct super_block *sb, *n;
|
||||||
|
|
||||||
spin_lock(&sb_lock);
|
spin_lock(&sb_lock);
|
||||||
list_for_each_entry(sb, &super_blocks, s_list) {
|
list_for_each_entry_safe(sb, n, &super_blocks, s_list) {
|
||||||
if (list_empty(&sb->s_instances))
|
if (list_empty(&sb->s_instances))
|
||||||
continue;
|
continue;
|
||||||
sb->s_count++;
|
sb->s_count++;
|
||||||
@ -618,8 +618,8 @@ static void do_emergency_remount(struct work_struct *work)
|
|||||||
do_remount_sb(sb, MS_RDONLY, NULL, 1);
|
do_remount_sb(sb, MS_RDONLY, NULL, 1);
|
||||||
}
|
}
|
||||||
up_write(&sb->s_umount);
|
up_write(&sb->s_umount);
|
||||||
put_super(sb);
|
|
||||||
spin_lock(&sb_lock);
|
spin_lock(&sb_lock);
|
||||||
|
__put_super(sb);
|
||||||
}
|
}
|
||||||
spin_unlock(&sb_lock);
|
spin_unlock(&sb_lock);
|
||||||
kfree(work);
|
kfree(work);
|
||||||
|
Loading…
Reference in New Issue
Block a user