| From 88960068f25fcc3759455d85460234dcc9d43fef Mon Sep 17 00:00:00 2001 |
| From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> |
| Date: Sat, 22 Dec 2018 11:22:26 +0100 |
| Subject: f2fs: fix validation of the block count in sanity_check_raw_super |
| |
| From: Martin Blumenstingl <martin.blumenstingl@googlemail.com> |
| |
| commit 88960068f25fcc3759455d85460234dcc9d43fef upstream. |
| |
| Treat "block_count" from struct f2fs_super_block as 64-bit little endian |
| value in sanity_check_raw_super() because struct f2fs_super_block |
| declares "block_count" as "__le64". |
| |
| This fixes a bug where the superblock validation fails on big endian |
| devices with the following error: |
| F2FS-fs (sda1): Wrong segment_count / block_count (61439 > 0) |
| F2FS-fs (sda1): Can't find valid F2FS filesystem in 1th superblock |
| F2FS-fs (sda1): Wrong segment_count / block_count (61439 > 0) |
| F2FS-fs (sda1): Can't find valid F2FS filesystem in 2th superblock |
| As result of this the partition cannot be mounted. |
| |
| With this patch applied the superblock validation works fine and the |
| partition can be mounted again: |
| F2FS-fs (sda1): Mounted with checkpoint version = 7c84 |
| |
| My little endian x86-64 hardware was able to mount the partition without |
| this fix. |
| To confirm that mounting f2fs filesystems works on big endian machines |
| again I tested this on a 32-bit MIPS big endian (lantiq) device. |
| |
| Fixes: 0cfe75c5b01199 ("f2fs: enhance sanity_check_raw_super() to avoid potential overflows") |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> |
| Reviewed-by: Chao Yu <yuchao0@huawei.com> |
| Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/f2fs/super.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/fs/f2fs/super.c |
| +++ b/fs/f2fs/super.c |
| @@ -1427,10 +1427,10 @@ static int sanity_check_raw_super(struct |
| return 1; |
| } |
| |
| - if (segment_count > (le32_to_cpu(raw_super->block_count) >> 9)) { |
| + if (segment_count > (le64_to_cpu(raw_super->block_count) >> 9)) { |
| f2fs_msg(sb, KERN_INFO, |
| - "Wrong segment_count / block_count (%u > %u)", |
| - segment_count, le32_to_cpu(raw_super->block_count)); |
| + "Wrong segment_count / block_count (%u > %llu)", |
| + segment_count, le64_to_cpu(raw_super->block_count)); |
| return 1; |
| } |
| |