From: Jaegeuk Kim <[email protected]>

[ Upstream commit a33be64b98d0723748d2fab0832b926613e1fce0 ]

This patch fixes to support different block size.

Reviewed-by: Chao Yu <[email protected]>
Signed-off-by: Jaegeuk Kim <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---

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;
-- 
2.51.0



_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to