From: liujinbao1 <[email protected]>

Add the defrag_blocks sysfs node to track
the amount of data blocks moved during filesystem
defragmentation.

Signed-off-by: Sheng Yong <[email protected]>
Signed-off-by: liujinbao1 <[email protected]>
---
 Documentation/ABI/testing/sysfs-fs-f2fs |  6 ++++++
 fs/f2fs/debug.c                         |  1 +
 fs/f2fs/f2fs.h                          |  5 +++++
 fs/f2fs/file.c                          |  4 +++-
 fs/f2fs/sysfs.c                         | 10 ++++++++++
 5 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs 
b/Documentation/ABI/testing/sysfs-fs-f2fs
index c1d2b3fd9c65..423ec40e2e4e 100644
--- a/Documentation/ABI/testing/sysfs-fs-f2fs
+++ b/Documentation/ABI/testing/sysfs-fs-f2fs
@@ -407,6 +407,12 @@ Contact:   "Hridya Valsaraju" <[email protected]>
 Description:   Average number of valid blocks.
                Available when CONFIG_F2FS_STAT_FS=y.
 
+What:          /sys/fs/f2fs/<disk>/defrag_blocks
+Date:          February 2026
+Contact:       "Jinbao Liu" <[email protected]>
+Description:   Number of blocks moved by defragment.
+               Available when CONFIG_F2FS_STAT_FS=y.
+
 What:          /sys/fs/f2fs/<disk>/mounted_time_sec
 Date:          February 2020
 Contact:       "Jaegeuk Kim" <[email protected]>
diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c
index 8e1040e375a7..af88db8fdb71 100644
--- a/fs/f2fs/debug.c
+++ b/fs/f2fs/debug.c
@@ -659,6 +659,7 @@ static int stat_show(struct seq_file *s, void *v)
                                si->bg_node_blks);
                seq_printf(s, "BG skip : IO: %u, Other: %u\n",
                                si->io_skip_bggc, si->other_skip_bggc);
+               seq_printf(s, "defrag blocks : %u\n", si->defrag_blks);
                seq_puts(s, "\nExtent Cache (Read):\n");
                seq_printf(s, "  - Hit Count: L1-1:%llu L1-2:%llu L2:%llu\n",
                                si->hit_largest, si->hit_cached[EX_READ],
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index bb34e864d0ef..dbf23cb2c501 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -4288,6 +4288,7 @@ struct f2fs_stat_info {
        int gc_secs[2][2];
        int tot_blks, data_blks, node_blks;
        int bg_data_blks, bg_node_blks;
+       unsigned int defrag_blks;
        int blkoff[NR_CURSEG_TYPE];
        int curseg[NR_CURSEG_TYPE];
        int cursec[NR_CURSEG_TYPE];
@@ -4422,6 +4423,9 @@ static inline struct f2fs_stat_info *F2FS_STAT(struct 
f2fs_sb_info *sbi)
                si->bg_node_blks += ((gc_type) == BG_GC) ? (blks) : 0;  \
        } while (0)
 
+#define stat_inc_defrag_blk_count(sbi, blks)                           \
+       (F2FS_STAT(sbi)->defrag_blks += (blks))
+
 int f2fs_build_stats(struct f2fs_sb_info *sbi);
 void f2fs_destroy_stats(struct f2fs_sb_info *sbi);
 void __init f2fs_create_root_stats(void);
@@ -4463,6 +4467,7 @@ void f2fs_update_sit_info(struct f2fs_sb_info *sbi);
 #define stat_inc_tot_blk_count(si, blks)               do { } while (0)
 #define stat_inc_data_blk_count(sbi, blks, gc_type)    do { } while (0)
 #define stat_inc_node_blk_count(sbi, blks, gc_type)    do { } while (0)
+#define stat_inc_defrag_blk_count(sbi, blks)           do { } while (0)
 
 static inline int f2fs_build_stats(struct f2fs_sb_info *sbi) { return 0; }
 static inline void f2fs_destroy_stats(struct f2fs_sb_info *sbi) { }
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index c8a2f17a8f11..2c4880f24b54 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -3043,8 +3043,10 @@ static int f2fs_defragment_range(struct f2fs_sb_info 
*sbi,
        clear_inode_flag(inode, FI_OPU_WRITE);
 unlock_out:
        inode_unlock(inode);
-       if (!err)
+       if (!err) {
                range->len = (u64)total << PAGE_SHIFT;
+               stat_inc_defrag_blk_count(sbi, total);
+       }
        return err;
 }
 
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index 5fbfdc96e502..969e06b65b04 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -338,6 +338,14 @@ static ssize_t avg_vblocks_show(struct f2fs_attr *a,
        f2fs_update_sit_info(sbi);
        return sysfs_emit(buf, "%llu\n", (unsigned long long)(si->avg_vblocks));
 }
+
+static ssize_t defrag_blocks_show(struct f2fs_attr *a,
+                               struct f2fs_sb_info *sbi, char *buf)
+{
+       struct f2fs_stat_info *si = F2FS_STAT(sbi);
+
+       return sysfs_emit(buf, "%llu\n", (unsigned long long)(si->defrag_blks));
+}
 #endif
 
 static ssize_t main_blkaddr_show(struct f2fs_attr *a,
@@ -1351,6 +1359,7 @@ F2FS_GENERAL_RO_ATTR(gc_mode);
 F2FS_GENERAL_RO_ATTR(moved_blocks_background);
 F2FS_GENERAL_RO_ATTR(moved_blocks_foreground);
 F2FS_GENERAL_RO_ATTR(avg_vblocks);
+F2FS_GENERAL_RO_ATTR(defrag_blocks);
 #endif
 
 #ifdef CONFIG_FS_ENCRYPTION
@@ -1473,6 +1482,7 @@ static struct attribute *f2fs_attrs[] = {
        ATTR_LIST(moved_blocks_foreground),
        ATTR_LIST(moved_blocks_background),
        ATTR_LIST(avg_vblocks),
+       ATTR_LIST(defrag_blocks),
 #endif
 #ifdef CONFIG_BLK_DEV_ZONED
        ATTR_LIST(unusable_blocks_per_sec),
-- 
2.25.1



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

Reply via email to