| From 0ecef49d576463df188050198f453ccb0ff385d5 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 21 Sep 2020 20:53:13 +0800 |
| Subject: f2fs: do sanity check on zoned block device path |
| |
| From: Chao Yu <yuchao0@huawei.com> |
| |
| [ Upstream commit 07eb1d699452de04e9d389ff17fb8fc9e975d7bf ] |
| |
| sbi->devs would be initialized only if image enables multiple device |
| feature or blkzoned feature, if blkzoned feature flag was set by fuzz |
| in non-blkzoned device, we will suffer below panic: |
| |
| get_zone_idx fs/f2fs/segment.c:4892 [inline] |
| f2fs_usable_zone_blks_in_seg fs/f2fs/segment.c:4943 [inline] |
| f2fs_usable_blks_in_seg+0x39b/0xa00 fs/f2fs/segment.c:4999 |
| Call Trace: |
| check_block_count+0x69/0x4e0 fs/f2fs/segment.h:704 |
| build_sit_entries fs/f2fs/segment.c:4403 [inline] |
| f2fs_build_segment_manager+0x51da/0xa370 fs/f2fs/segment.c:5100 |
| f2fs_fill_super+0x3880/0x6ff0 fs/f2fs/super.c:3684 |
| mount_bdev+0x32e/0x3f0 fs/super.c:1417 |
| legacy_get_tree+0x105/0x220 fs/fs_context.c:592 |
| vfs_get_tree+0x89/0x2f0 fs/super.c:1547 |
| do_new_mount fs/namespace.c:2896 [inline] |
| path_mount+0x12ae/0x1e70 fs/namespace.c:3216 |
| do_mount fs/namespace.c:3229 [inline] |
| __do_sys_mount fs/namespace.c:3437 [inline] |
| __se_sys_mount fs/namespace.c:3414 [inline] |
| __x64_sys_mount+0x27f/0x300 fs/namespace.c:3414 |
| do_syscall_64+0x2d/0x70 arch/x86/entry/common.c:46 |
| |
| Add sanity check to inconsistency on factors: blkzoned flag, device |
| path and device character to avoid above panic. |
| |
| Signed-off-by: Chao Yu <yuchao0@huawei.com> |
| Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| fs/f2fs/super.c | 6 ++++++ |
| 1 file changed, 6 insertions(+) |
| |
| diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c |
| index dfa072fa80815..be5050292caa5 100644 |
| --- a/fs/f2fs/super.c |
| +++ b/fs/f2fs/super.c |
| @@ -2832,6 +2832,12 @@ static int sanity_check_raw_super(struct f2fs_sb_info *sbi, |
| segment_count, dev_seg_count); |
| return -EFSCORRUPTED; |
| } |
| + } else { |
| + if (__F2FS_HAS_FEATURE(raw_super, F2FS_FEATURE_BLKZONED) && |
| + !bdev_is_zoned(sbi->sb->s_bdev)) { |
| + f2fs_info(sbi, "Zoned block device path is missing"); |
| + return -EFSCORRUPTED; |
| + } |
| } |
| |
| if (secs_per_zone > total_sections || !secs_per_zone) { |
| -- |
| 2.27.0 |
| |