Introduce /sys/fs/f2fs/<devname>/stat/sb_status to show superblock
status in real time.

Signed-off-by: Chao Yu <yuch...@huawei.com>
---
 Documentation/ABI/testing/sysfs-fs-f2fs |  5 ++++
 fs/f2fs/sysfs.c                         | 36 +++++++++++++++++++++++++
 2 files changed, 41 insertions(+)

diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs 
b/Documentation/ABI/testing/sysfs-fs-f2fs
index 3dfee94e0618..57ab839dc3a2 100644
--- a/Documentation/ABI/testing/sysfs-fs-f2fs
+++ b/Documentation/ABI/testing/sysfs-fs-f2fs
@@ -377,3 +377,8 @@ Description:        This gives a control to limit the bio 
size in f2fs.
                Default is zero, which will follow underlying block layer limit,
                whereas, if it has a certain bytes value, f2fs won't submit a
                bio larger than that size.
+
+What:          /sys/fs/f2fs/<disk>/stat/sb_status
+Date:          December 2020
+Contact:       "Chao Yu" <yuch...@huawei.com>
+Description:   Show status of f2fs superblock in real time.
diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c
index ebca0b4961e8..1b85e6d16a94 100644
--- a/fs/f2fs/sysfs.c
+++ b/fs/f2fs/sysfs.c
@@ -101,6 +101,40 @@ static ssize_t lifetime_write_kbytes_show(struct f2fs_attr 
*a,
                                sbi->sectors_written_start) >> 1)));
 }
 
+#define        SB_STATUS(s)    (s ? "yes" : "no")
+static ssize_t sb_status_show(struct f2fs_attr *a,
+               struct f2fs_sb_info *sbi, char *buf)
+{
+       return sprintf(buf, "IS_DIRTY:          %s\n"
+                               "IS_CLOSE:              %s\n"
+                               "IS_SHUTDOWN:           %s\n"
+                               "IS_RECOVERED:          %s\n"
+                               "IS_RESIZEFS:           %s\n"
+                               "NEED_FSCK:             %s\n"
+                               "POR_DOING:             %s\n"
+                               "NEED_SB_WRITE:         %s\n"
+                               "NEED_CP:               %s\n"
+                               "CP_DISABLED:           %s\n"
+                               "CP_DISABLED_QUICK:     %s\n"
+                               "QUOTA_NEED_FLUSH:      %s\n"
+                               "QUOTA_SKIP_FLUSH:      %s\n"
+                               "QUOTA_NEED_REPAIR:     %s\n",
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_IS_DIRTY)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_IS_CLOSE)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_IS_RECOVERED)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_IS_RESIZEFS)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_NEED_FSCK)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_POR_DOING)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_NEED_SB_WRITE)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_NEED_CP)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_CP_DISABLED)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_CP_DISABLED_QUICK)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_QUOTA_NEED_FLUSH)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_QUOTA_SKIP_FLUSH)),
+                       SB_STATUS(is_sbi_flag_set(sbi, SBI_QUOTA_NEED_REPAIR)));
+}
+
 static ssize_t features_show(struct f2fs_attr *a,
                struct f2fs_sb_info *sbi, char *buf)
 {
@@ -711,7 +745,9 @@ static struct attribute *f2fs_feat_attrs[] = {
 };
 ATTRIBUTE_GROUPS(f2fs_feat);
 
+F2FS_GENERAL_RO_ATTR(sb_status);
 static struct attribute *f2fs_stat_attrs[] = {
+       ATTR_LIST(sb_status),
        NULL,
 };
 ATTRIBUTE_GROUPS(f2fs_stat);
-- 
2.29.2

Reply via email to