From 7a64f18f6941d51b4e2b4b2dfd1a389ce41d7384 Mon Sep 17 00:00:00 2001 From: Juhyung Park Date: Tue, 4 Apr 2023 14:54:46 +0900 Subject: [PATCH] fsck.f2fs: fix sanity check logic for cp_payload cp_payload is set differently [1] when extended node bitmap feature is enabled. Commit b79c3ba4ea9d 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: b79c3ba4ea9d ("fsck.f2fs: sanity check cp_payload before reading checkpoint") Reported-by: Alexander Koskovich Signed-off-by: Juhyung Park Signed-off-by: Jaegeuk Kim --- fsck/mount.c | 2 +- include/f2fs_fs.h | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/fsck/mount.c b/fsck/mount.c index 1d0df88..0e0c3f9 100644 --- a/fsck/mount.c +++ b/fsck/mount.c @@ -1248,7 +1248,7 @@ int get_valid_checkpoint(struct f2fs_sb_info *sbi) int ret; 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; cp_blks = 1 + cp_payload; diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h index 333ae07..f890634 100644 --- a/include/f2fs_fs.h +++ b/include/f2fs_fs.h @@ -1168,6 +1168,10 @@ static_assert(sizeof(struct f2fs_nat_block) == 4095, ""); #define MAX_SIT_BITMAP_SIZE (SEG_ALIGN(SIZE_ALIGN(F2FS_MAX_SEGMENT, \ SIT_ENTRY_PER_BLOCK)) * \ 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.