From: liujinbao1 <[email protected]>

Add trace_f2fs_fault_report to trigger reporting upon f2fs_bug_on,
need_fsck, stop_checkpoint, and handle_eio. Since f2fs_bug_on and
need_fsck can be triggered in hundreds of scenarios, define set_sbi_flag
as a macro to help capture the effective fault function and line number.

Signed-off-by: shengyong1 <[email protected]>
Signed-off-by: liujinbao1 <[email protected]>
---
v3:
- Fix __assign_str() to use single-argument form
v2:
- Remove REPORT_FAULT_PAGE_EIO from f2fs_handle_page_eio
---
 fs/f2fs/f2fs.h              | 18 +++++++++++++++++-
 fs/f2fs/super.c             |  9 +++++++++
 include/trace/events/f2fs.h | 28 ++++++++++++++++++++++++++++
 3 files changed, 54 insertions(+), 1 deletion(-)

diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index 02bc6eb96a59..4fb3ad73bd2c 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -98,6 +98,15 @@ extern const char *f2fs_fault_name[FAULT_MAX];
 #define DEFAULT_FAILURE_RETRY_COUNT            1
 #endif
 
+enum {
+       REPORT_FAULT_NEED_FSCK,
+       REPORT_FAULT_STOP_CP,
+       REPORT_FAULT_MAX,
+};
+
+void f2fs_fault_report(struct super_block *sb, unsigned int err_code,
+                       const char *func, unsigned int data);
+
 /*
  * For mount options
  */
@@ -2282,11 +2291,18 @@ static inline bool is_sbi_flag_set(struct f2fs_sb_info 
*sbi, unsigned int type)
        return test_bit(type, &sbi->s_flag);
 }
 
-static inline void set_sbi_flag(struct f2fs_sb_info *sbi, unsigned int type)
+static inline void __set_sbi_flag(struct f2fs_sb_info *sbi, unsigned int type)
 {
        set_bit(type, &sbi->s_flag);
 }
 
+#define set_sbi_flag(sbi, type)                                \
+do {                                                   \
+       __set_sbi_flag(sbi, type);                      \
+       if ((type) == SBI_NEED_FSCK)                    \
+               f2fs_fault_report(sbi->sb, REPORT_FAULT_NEED_FSCK, __func__, 
__LINE__); \
+} while (0)
+
 static inline void clear_sbi_flag(struct f2fs_sb_info *sbi, unsigned int type)
 {
        clear_bit(type, &sbi->s_flag);
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 11d1e0c99ac1..251f914b3b62 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -4731,9 +4731,18 @@ static void f2fs_handle_critical_error(struct 
f2fs_sb_info *sbi,
         */
 }
 
+void f2fs_fault_report(struct super_block *sb, unsigned int err_code,
+                       const char *func, unsigned int data)
+{
+       trace_f2fs_fault_report(sb, err_code, func, data);
+}
+
 void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io,
                                                unsigned char reason)
 {
+       if (reason != STOP_CP_REASON_SHUTDOWN)
+               f2fs_fault_report(sbi->sb, REPORT_FAULT_STOP_CP, __func__, 
reason);
+
        f2fs_build_fault_attr(sbi, 0, 0, FAULT_ALL);
        if (!end_io)
                f2fs_flush_merged_writes(sbi);
diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
index 49c6cbb6f989..563d742e0646 100644
--- a/include/trace/events/f2fs.h
+++ b/include/trace/events/f2fs.h
@@ -2595,6 +2595,34 @@ DEFINE_EVENT(f2fs_priority_update, f2fs_priority_restore,
        TP_ARGS(sbi, lock_name, is_write, p, orig_prio, new_prio)
 );
 
+TRACE_EVENT(f2fs_fault_report,
+
+       TP_PROTO(struct super_block *sb, unsigned int err_code,
+               const char *func, unsigned int data),
+
+       TP_ARGS(sb, err_code, func, data),
+
+       TP_STRUCT__entry(
+               __field(dev_t, dev)
+               __field(unsigned int, err_code)
+               __string(func, func)
+               __field(unsigned int, data)
+       ),
+
+       TP_fast_assign(
+               __entry->dev            = sb->s_dev;
+               __entry->err_code       = err_code;
+               __assign_str(func);
+               __entry->data           = data;
+       ),
+
+       TP_printk("dev = (%d,%d), err_code = %u, func = %s, data = %u",
+               show_dev(__entry->dev),
+               __entry->err_code,
+               __get_str(func),
+               __entry->data)
+);
+
 #endif /* _TRACE_F2FS_H */
 
  /* This part must be outside protection */
-- 
2.43.0



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

Reply via email to