btrfs: zoned: mark relocation as writing
commitca5e4ea0be
upstream. There is a hung_task issue with running generic/068 on an SMR device. The hang occurs while a process is trying to thaw the filesystem. The process is trying to take sb->s_umount to thaw the FS. The lock is held by fsstress, which calls btrfs_sync_fs() and is waiting for an ordered extent to finish. However, as the FS is frozen, the ordered extents never finish. Having an ordered extent while the FS is frozen is the root cause of the hang. The ordered extent is initiated from btrfs_relocate_chunk() which is called from btrfs_reclaim_bgs_work(). This commit adds sb_*_write() around btrfs_relocate_chunk() call site. For the usual "btrfs balance" command, we already call it with mnt_want_file() in btrfs_ioctl_balance(). Fixes:18bb8bbf13
("btrfs: zoned: automatically reclaim zones") CC: stable@vger.kernel.org # 5.13+ Link: https://github.com/naota/linux/issues/56 Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
2bd666b0fd
Коммит
68a8120e16
|
@ -1504,8 +1504,12 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
|
|||
if (!test_bit(BTRFS_FS_OPEN, &fs_info->flags))
|
||||
return;
|
||||
|
||||
if (!btrfs_exclop_start(fs_info, BTRFS_EXCLOP_BALANCE))
|
||||
sb_start_write(fs_info->sb);
|
||||
|
||||
if (!btrfs_exclop_start(fs_info, BTRFS_EXCLOP_BALANCE)) {
|
||||
sb_end_write(fs_info->sb);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Long running balances can keep us blocked here for eternity, so
|
||||
|
@ -1513,6 +1517,7 @@ void btrfs_reclaim_bgs_work(struct work_struct *work)
|
|||
*/
|
||||
if (!mutex_trylock(&fs_info->reclaim_bgs_lock)) {
|
||||
btrfs_exclop_finish(fs_info);
|
||||
sb_end_write(fs_info->sb);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1581,6 +1586,7 @@ next:
|
|||
spin_unlock(&fs_info->unused_bgs_lock);
|
||||
mutex_unlock(&fs_info->reclaim_bgs_lock);
|
||||
btrfs_exclop_finish(fs_info);
|
||||
sb_end_write(fs_info->sb);
|
||||
}
|
||||
|
||||
void btrfs_reclaim_bgs(struct btrfs_fs_info *fs_info)
|
||||
|
|
|
@ -8185,10 +8185,12 @@ static int relocating_repair_kthread(void *data)
|
|||
target = cache->start;
|
||||
btrfs_put_block_group(cache);
|
||||
|
||||
sb_start_write(fs_info->sb);
|
||||
if (!btrfs_exclop_start(fs_info, BTRFS_EXCLOP_BALANCE)) {
|
||||
btrfs_info(fs_info,
|
||||
"zoned: skip relocating block group %llu to repair: EBUSY",
|
||||
target);
|
||||
sb_end_write(fs_info->sb);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
|
@ -8216,6 +8218,7 @@ out:
|
|||
btrfs_put_block_group(cache);
|
||||
mutex_unlock(&fs_info->reclaim_bgs_lock);
|
||||
btrfs_exclop_finish(fs_info);
|
||||
sb_end_write(fs_info->sb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче