fsck.f2fs: fix sanity check logic for cp_payload

cp_payload is set differently [1] when extended node bitmap feature is
enabled. Commit b79c3ba4ea broke fsck on f2fs file systems created on
2+ TB device with extended node bitmap feature enabled.

As the sanity check is for checking overflows, fix this to assume the max
possible cp_payload size under the extended node bitmap.

Link: https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs-tools.git/tree/mkfs/f2fs_format.c?h=v1.15.0#n372 [1]
Fixes: b79c3ba4ea ("fsck.f2fs: sanity check cp_payload before reading checkpoint")
Reported-by: Alexander Koskovich <akoskovich@pm.me>
Signed-off-by: Juhyung Park <qkrwngud825@gmail.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
Juhyung Park 2023-04-04 14:54:46 +09:00 committed by sunshenshen
parent 7835032f2c
commit 7a64f18f69
2 changed files with 5 additions and 1 deletions

View File

@ -1248,7 +1248,7 @@ int get_valid_checkpoint(struct f2fs_sb_info *sbi)
int ret; int ret;
cp_payload = get_sb(cp_payload); cp_payload = get_sb(cp_payload);
if (cp_payload > F2FS_BLK_ALIGN(MAX_SIT_BITMAP_SIZE)) if (cp_payload > F2FS_BLK_ALIGN(MAX_CP_PAYLOAD))
return -EINVAL; return -EINVAL;
cp_blks = 1 + cp_payload; cp_blks = 1 + cp_payload;

View File

@ -1168,6 +1168,10 @@ static_assert(sizeof(struct f2fs_nat_block) == 4095, "");
#define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(SIZE_ALIGN(F2FS_MAX_SEGMENT, \ #define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(SIZE_ALIGN(F2FS_MAX_SEGMENT, \
SIT_ENTRY_PER_BLOCK)) * \ SIT_ENTRY_PER_BLOCK)) * \
c.blks_per_seg / 8) c.blks_per_seg / 8)
#define MAX_CP_PAYLOAD (SEG_ALIGN(SIZE_ALIGN(UINT32_MAX, NAT_ENTRY_PER_BLOCK)) * \
DEFAULT_NAT_ENTRY_RATIO / 100 * \
c.blks_per_seg / 8 + \
MAX_SIT_BITMAP_SIZE - MAX_BITMAP_SIZE_IN_CKPT)
/* /*
* Note that f2fs_sit_entry->vblocks has the following bit-field information. * Note that f2fs_sit_entry->vblocks has the following bit-field information.