[PATCHv2 for-next 03/24] block/rnbd: Enable the fault-injection
From: Gioh Kim <hidden>
Date: 2021-03-30 07:39:13
Subsystem:
block layer, rnbd block drivers, the rest · Maintainers:
Jens Axboe, Md. Haris Iqbal, Jack Wang, Linus Torvalds
From: Gioh Kim <redacted> This patch introduces functions to enable the fault-injection for RTRS. * rnbd_fault_inject_init/final: initialize the fault-injection and create a debugfs directory. * rnbd_fault_inject_add: create a debugfs entry to enable the fault-injection point. Signed-off-by: Gioh Kim <redacted> Signed-off-by: Jack Wang <jinpu.wang@cloud.ionos.com> --- drivers/block/rnbd/rnbd-common.c | 44 ++++++++++++++++++++++++++++++++ drivers/block/rnbd/rnbd-proto.h | 14 ++++++++++ 2 files changed, 58 insertions(+)
diff --git a/drivers/block/rnbd/rnbd-common.c b/drivers/block/rnbd/rnbd-common.c
index 596c3f732403..84bfbf015f6d 100644
--- a/drivers/block/rnbd/rnbd-common.c
+++ b/drivers/block/rnbd/rnbd-common.c@@ -21,3 +21,47 @@ const char *rnbd_access_mode_str(enum rnbd_access_mode mode) return "unknown"; } } + +#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS +static DECLARE_FAULT_ATTR(fail_default_attr); + +void rnbd_fault_inject_init(struct rnbd_fault_inject *fj, + const char *dir_name, + u32 err_status) +{ + struct dentry *dir, *parent; + struct fault_attr *attr = &fj->attr; + + /* create debugfs directory and attribute */ + parent = debugfs_create_dir(dir_name, NULL); + if (!parent) { + pr_warn("%s: failed to create debugfs directory\n", dir_name); + return; + } + + *attr = fail_default_attr; + dir = fault_create_debugfs_attr("fault_inject", parent, attr); + if (IS_ERR(dir)) { + pr_warn("%s: failed to create debugfs attr\n", dir_name); + debugfs_remove_recursive(parent); + return; + } + fj->parent = parent; + fj->dir = dir; + + /* create debugfs for status code */ + fj->status = err_status; + debugfs_create_u32("status", 0600, dir, &fj->status); +} + +void rnbd_fault_inject_add(struct dentry *dir, const char *fname, bool *value) +{ + debugfs_create_bool(fname, 0600, dir, value); +} + +void rnbd_fault_inject_final(struct rnbd_fault_inject *fj) +{ + /* remove debugfs directories */ + debugfs_remove_recursive(fj->parent); +} +#endif
diff --git a/drivers/block/rnbd/rnbd-proto.h b/drivers/block/rnbd/rnbd-proto.h
index c1bc5c0fef71..d13dc1d3a00e 100644
--- a/drivers/block/rnbd/rnbd-proto.h
+++ b/drivers/block/rnbd/rnbd-proto.h@@ -15,6 +15,7 @@ #include <linux/inet.h> #include <linux/in.h> #include <linux/in6.h> +#include <linux/fault-inject.h> #include <rdma/ib.h> #define RNBD_PROTO_VER_MAJOR 2
@@ -305,6 +306,19 @@ static inline u32 rq_to_rnbd_flags(struct request *rq) return rnbd_opf; } +struct rnbd_fault_inject { +#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS + struct fault_attr attr; + struct dentry *parent; + struct dentry *dir; + u32 status; +#endif +}; + const char *rnbd_access_mode_str(enum rnbd_access_mode mode); +void rnbd_fault_inject_init(struct rnbd_fault_inject *fj, + const char *dev_name, u32 err_status); +void rnbd_fault_inject_add(struct dentry *dir, const char *fname, bool *value); +void rnbd_fault_inject_final(struct rnbd_fault_inject *fj); #endif /* RNBD_PROTO_H */
--
2.25.1