]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
f2fs: Add defrag_blocks sysfs node
authorliujinbao1 <liujinbao1@xiaomi.com>
Fri, 27 Feb 2026 03:02:54 +0000 (11:02 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 24 Mar 2026 17:20:59 +0000 (17:20 +0000)
Add the defrag_blocks sysfs node to track
the amount of data blocks moved during filesystem
defragmentation.

Signed-off-by: Sheng Yong <shengyong1@xiaomi.com>
Signed-off-by: liujinbao1 <liujinbao1@xiaomi.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Documentation/ABI/testing/sysfs-fs-f2fs
fs/f2fs/debug.c
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/sysfs.c

index c1d2b3fd9c65d1f5309070796128162c619971ca..423ec40e2e4e2da5eb52bb907329fe0cbb733823 100644 (file)
@@ -407,6 +407,12 @@ Contact:   "Hridya Valsaraju" <hridya@google.com>
 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" <liujinbao1@xiaomi.com>
+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" <jaegeuk@kernel.org>
index 8e1040e375a7b0aeb401404982a34691a5d2204c..af88db8fdb7112648316d4bc96131c0c907f9fa8 100644 (file)
@@ -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],
index bb34e864d0efc742c651a285c5989bd73530fbe3..dbf23cb2c501cdb7666b085a8e73076ec2d10898 100644 (file)
@@ -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) { }
index c8a2f17a8f11cfc746c6a6ec4a225199929c2ee6..2c4880f24b546b012b2383328c3d48c6a947a038 100644 (file)
@@ -3043,8 +3043,10 @@ out:
        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;
 }
 
index 5fbfdc96e502d60c800f9ed8632a7c11b2e7e9e3..969e06b65b0467f07727e0f2faf736f4fd1a6a4e 100644 (file)
@@ -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),