]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
f2fs: add carve_out sysfs node
authorDaeho Jeong <daehojeong@google.com>
Tue, 11 Mar 2025 18:29:31 +0000 (11:29 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Thu, 13 Mar 2025 18:15:59 +0000 (18:15 +0000)
For several zoned storage devices, vendors will provide extra space
which was used for device level GC than specs and F2FS can use this
space for filesystem level GC. To do that, we can reserve the space
using reserved_blocks. However, it is not enough, since this extra
space should not be shown to users. So, with this new sysfs node,
we can hide the space by substracting reserved_blocks from total
bytes.

Signed-off-by: Daeho Jeong <daehojeong@google.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Documentation/ABI/testing/sysfs-fs-f2fs
fs/f2fs/f2fs.h
fs/f2fs/super.c
fs/f2fs/sysfs.c

index b9a000e5098abdf1e2c5e5bcd621cc7caf61b9ce..2c85c6b8da8da786d911f52734c0a9e82a9515f5 100644 (file)
@@ -836,3 +836,13 @@ Contact:   "Jaegeuk Kim" <jaegeuk@kernel.org>
 Description:   It reclaims the given KBs of file-backed pages registered by
                ioctl(F2FS_IOC_DONATE_RANGE).
                For example, writing N tries to drop N KBs spaces in LRU.
+
+What:          /sys/fs/f2fs/<disk>/carve_out
+Date:          March 2025
+Contact:       "Daeho Jeong" <daehojeong@google.com>
+Description:   For several zoned storage devices, vendors will provide extra space which
+               was used for device level GC than specs and F2FS can use this space for
+               filesystem level GC. To do that, we can reserve the space using
+               reserved_blocks. However, it is not enough, since this extra space should
+               not be shown to users. So, with this new sysfs node, we can hide the space
+               by substracting reserved_blocks from total bytes.
index 99ded6512d8b0ddd9e02a6cf37f40f0561715bcf..a8c7fb46222e7ec86ec43d3ea9d91fd592ad1116 100644 (file)
@@ -1813,6 +1813,9 @@ struct f2fs_sb_info {
        u64 committed_atomic_block;
        u64 revoked_atomic_block;
 
+       /* carve out reserved_blocks from total blocks */
+       bool carve_out;
+
 #ifdef CONFIG_F2FS_FS_COMPRESSION
        struct kmem_cache *page_array_slab;     /* page array entry */
        unsigned int page_array_slab_size;      /* default page array slab size */
index 397df271885ce616d1d1893b3cb60d7202943aed..1da1f154e5d42ba9498ccbc5acfab9329482939c 100644 (file)
@@ -1849,7 +1849,8 @@ static int f2fs_statfs(struct dentry *dentry, struct kstatfs *buf)
        buf->f_blocks = total_count - start_count;
 
        spin_lock(&sbi->stat_lock);
-
+       if (sbi->carve_out)
+               buf->f_blocks -= sbi->current_reserved_blocks;
        user_block_count = sbi->user_block_count;
        total_valid_node_count = valid_node_count(sbi);
        avail_node_count = sbi->total_node_count - F2FS_RESERVED_NODE_NUM;
index b27336acf519e9a944bbd91cfdcb96235091f662..c691613664675fd0bacbeb37ad764baf7da85d78 100644 (file)
@@ -1122,6 +1122,7 @@ F2FS_SBI_GENERAL_RW_ATTR(max_read_extent_count);
 F2FS_SBI_GENERAL_RO_ATTR(unusable_blocks_per_sec);
 F2FS_SBI_GENERAL_RW_ATTR(blkzone_alloc_policy);
 #endif
+F2FS_SBI_GENERAL_RW_ATTR(carve_out);
 
 /* STAT_INFO ATTR */
 #ifdef CONFIG_F2FS_STAT_FS
@@ -1309,6 +1310,7 @@ static struct attribute *f2fs_attrs[] = {
        ATTR_LIST(warm_data_age_threshold),
        ATTR_LIST(last_age_weight),
        ATTR_LIST(max_read_extent_count),
+       ATTR_LIST(carve_out),
        NULL,
 };
 ATTRIBUTE_GROUPS(f2fs);