From: Jaegeuk Kim jaegeuk@kernel.org
[ Upstream commit a33be64b98d0723748d2fab0832b926613e1fce0 ]
This patch fixes to support different block size.
Reviewed-by: Chao Yu chao@kernel.org Signed-off-by: Jaegeuk Kim jaegeuk@kernel.org Signed-off-by: Sasha Levin sashal@kernel.org ---
LLM Generated explanations, may be completely bogus:
YES
Explanation - Fix scope: Corrects user-visible layout info in `/proc/fs/f2fs/<sb>/disk_map` for non-4KB page/block sizes. Previously, sizes were hardcoded to a 2MB-per-segment assumption, producing wrong values on 16KB/64KB systems. - What changed: In `fs/f2fs/sysfs.c:disk_map_seq_show` the output now derives sizes from block size instead of assuming 4KB: - Adds block size line: fs/f2fs/sysfs.c:1771 - `seq_printf(..., " Block size : %12lu KB\n", F2FS_BLKSIZE >> 10);` - Computes segment size in MB generically: fs/f2fs/sysfs.c:1772 - `seq_printf(..., " Segment size : %12d MB\n", (BLKS_PER_SEG(sbi) << (F2FS_BLKSIZE_BITS - 10)) >> 10);` - Computes section size in MB generically: fs/f2fs/sysfs.c:1776 - `seq_printf(..., " Section size : %12d MB\n", (BLKS_PER_SEC(sbi) << (F2FS_BLKSIZE_BITS - 10)) >> 10);` - Relocates the “# of Sections” line beneath section size for clarity: fs/f2fs/sysfs.c:1778 - Why it matters: On 16KB systems (`F2FS_BLKSIZE_BITS=14`), a segment is 512 blocks × 16KB = 8MB. The old code printed section size using `SEGS_PER_SEC << 1` (2MB/segment assumption), underreporting by 4×. On 64KB pages, segments are 32MB, making the error even larger. - Correctness of the new math: The expression `(blocks << (F2FS_BLKSIZE_BITS - 10)) >> 10` equals `blocks * (block_size_bytes / 1MB)` and yields the right MB count for any `PAGE_SHIFT` (e.g., 12→4KB, 14→16KB, 16→64KB). Definitions: `F2FS_BLKSIZE = PAGE_SIZE`, `F2FS_BLKSIZE_BITS = PAGE_SHIFT` (include/linux/f2fs_fs.h:18–19). Block-to-segment/section counts are via `BLKS_PER_SEG(sbi)` and `BLKS_PER_SEC(sbi)` (fs/f2fs/f2fs.h:1946–1947). - User impact: Fixes inaccurate diagnostics that admins and tooling may rely on when inspecting F2FS layout. No on-disk format or runtime behavior change; purely display. - Containment and risk: Single function, print-only changes in a procfs seq_file. No locking, no state changes, no dependency impact. Extremely low regression risk. The proc output format gains two lines (“Block size”, “Segment size”) and reorders “# of Sections”; procfs output is not a stable ABI, and this is a correctness fix. - Stable criteria: - Fixes a real bug that affects users on non-4KB page systems. - Small, localized change; no architectural modifications. - Minimal risk of regression; no functional side effects. - Touches a filesystem but only its proc reporting path. - No “Cc: stable” tag, but the fix is obvious and self-contained.
Conclusion: This is a safe, correctness-only fix improving accuracy of f2fs diagnostics on 16KB/64KB page systems and should be backported.
fs/f2fs/sysfs.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c index f736052dea50a..902ffb3faa1ff 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -1723,12 +1723,15 @@ static int __maybe_unused disk_map_seq_show(struct seq_file *seq, seq_printf(seq, " Main : 0x%010x (%10d)\n", SM_I(sbi)->main_blkaddr, le32_to_cpu(F2FS_RAW_SUPER(sbi)->segment_count_main)); - seq_printf(seq, " # of Sections : %12d\n", - le32_to_cpu(F2FS_RAW_SUPER(sbi)->section_count)); + seq_printf(seq, " Block size : %12lu KB\n", F2FS_BLKSIZE >> 10); + seq_printf(seq, " Segment size : %12d MB\n", + (BLKS_PER_SEG(sbi) << (F2FS_BLKSIZE_BITS - 10)) >> 10); seq_printf(seq, " Segs/Sections : %12d\n", SEGS_PER_SEC(sbi)); seq_printf(seq, " Section size : %12d MB\n", - SEGS_PER_SEC(sbi) << 1); + (BLKS_PER_SEC(sbi) << (F2FS_BLKSIZE_BITS - 10)) >> 10); + seq_printf(seq, " # of Sections : %12d\n", + le32_to_cpu(F2FS_RAW_SUPER(sbi)->section_count));
if (!f2fs_is_multi_device(sbi)) return 0;