1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
26ff1cb35SAkinobu Mita #ifndef _LINUX_FAULT_INJECT_H
36ff1cb35SAkinobu Mita #define _LINUX_FAULT_INJECT_H
46ff1cb35SAkinobu Mita
5*6ce2082fSJani Nikula #include <linux/err.h>
6*6ce2082fSJani Nikula #include <linux/types.h>
7*6ce2082fSJani Nikula
8*6ce2082fSJani Nikula struct dentry;
9*6ce2082fSJani Nikula struct kmem_cache;
10*6ce2082fSJani Nikula
116ff1cb35SAkinobu Mita #ifdef CONFIG_FAULT_INJECTION
126ff1cb35SAkinobu Mita
13*6ce2082fSJani Nikula #include <linux/atomic.h>
144668c7a2SAkinobu Mita #include <linux/configfs.h>
156adc4a22SDmitry Monakhov #include <linux/ratelimit.h>
166ff1cb35SAkinobu Mita
176ff1cb35SAkinobu Mita /*
186ff1cb35SAkinobu Mita * For explanation of the elements of this struct, see
1910ffebbeSMauro Carvalho Chehab * Documentation/fault-injection/fault-injection.rst
206ff1cb35SAkinobu Mita */
216ff1cb35SAkinobu Mita struct fault_attr {
226ff1cb35SAkinobu Mita unsigned long probability;
236ff1cb35SAkinobu Mita unsigned long interval;
246ff1cb35SAkinobu Mita atomic_t times;
256ff1cb35SAkinobu Mita atomic_t space;
266ff1cb35SAkinobu Mita unsigned long verbose;
27621a5f7aSViresh Kumar bool task_filter;
28329409aeSAkinobu Mita unsigned long stacktrace_depth;
29329409aeSAkinobu Mita unsigned long require_start;
30329409aeSAkinobu Mita unsigned long require_end;
31329409aeSAkinobu Mita unsigned long reject_start;
32329409aeSAkinobu Mita unsigned long reject_end;
336ff1cb35SAkinobu Mita
346ff1cb35SAkinobu Mita unsigned long count;
356adc4a22SDmitry Monakhov struct ratelimit_state ratelimit_state;
366adc4a22SDmitry Monakhov struct dentry *dname;
376ff1cb35SAkinobu Mita };
386ff1cb35SAkinobu Mita
39ea4452deSQi Zheng enum fault_flags {
40ea4452deSQi Zheng FAULT_NOWARN = 1 << 0,
41ea4452deSQi Zheng };
42ea4452deSQi Zheng
436ff1cb35SAkinobu Mita #define FAULT_ATTR_INITIALIZER { \
446ff1cb35SAkinobu Mita .interval = 1, \
456ff1cb35SAkinobu Mita .times = ATOMIC_INIT(1), \
46329409aeSAkinobu Mita .require_end = ULONG_MAX, \
47329409aeSAkinobu Mita .stacktrace_depth = 32, \
486adc4a22SDmitry Monakhov .ratelimit_state = RATELIMIT_STATE_INIT_DISABLED, \
496b1b60f4SDon Mullis .verbose = 2, \
506adc4a22SDmitry Monakhov .dname = NULL, \
516ff1cb35SAkinobu Mita }
526ff1cb35SAkinobu Mita
536ff1cb35SAkinobu Mita #define DECLARE_FAULT_ATTR(name) struct fault_attr name = FAULT_ATTR_INITIALIZER
546ff1cb35SAkinobu Mita int setup_fault_attr(struct fault_attr *attr, char *str);
55ea4452deSQi Zheng bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags);
5608b3df2dSDon Mullis bool should_fail(struct fault_attr *attr, ssize_t size);
576ff1cb35SAkinobu Mita
58*6ce2082fSJani Nikula #else /* CONFIG_FAULT_INJECTION */
59*6ce2082fSJani Nikula
60*6ce2082fSJani Nikula struct fault_attr {
61*6ce2082fSJani Nikula };
62*6ce2082fSJani Nikula
63*6ce2082fSJani Nikula #define DECLARE_FAULT_ATTR(name) struct fault_attr name = {}
64*6ce2082fSJani Nikula
setup_fault_attr(struct fault_attr * attr,char * str)65*6ce2082fSJani Nikula static inline int setup_fault_attr(struct fault_attr *attr, char *str)
66*6ce2082fSJani Nikula {
67*6ce2082fSJani Nikula return 0; /* Note: 0 means error for __setup() handlers! */
68*6ce2082fSJani Nikula }
should_fail_ex(struct fault_attr * attr,ssize_t size,int flags)69*6ce2082fSJani Nikula static inline bool should_fail_ex(struct fault_attr *attr, ssize_t size, int flags)
70*6ce2082fSJani Nikula {
71*6ce2082fSJani Nikula return false;
72*6ce2082fSJani Nikula }
should_fail(struct fault_attr * attr,ssize_t size)73*6ce2082fSJani Nikula static inline bool should_fail(struct fault_attr *attr, ssize_t size)
74*6ce2082fSJani Nikula {
75*6ce2082fSJani Nikula return false;
76*6ce2082fSJani Nikula }
77*6ce2082fSJani Nikula
78*6ce2082fSJani Nikula #endif /* CONFIG_FAULT_INJECTION */
79*6ce2082fSJani Nikula
806ff1cb35SAkinobu Mita #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
816ff1cb35SAkinobu Mita
82dd48c085SAkinobu Mita struct dentry *fault_create_debugfs_attr(const char *name,
83dd48c085SAkinobu Mita struct dentry *parent, struct fault_attr *attr);
846ff1cb35SAkinobu Mita
856ff1cb35SAkinobu Mita #else /* CONFIG_FAULT_INJECTION_DEBUG_FS */
866ff1cb35SAkinobu Mita
fault_create_debugfs_attr(const char * name,struct dentry * parent,struct fault_attr * attr)87dd48c085SAkinobu Mita static inline struct dentry *fault_create_debugfs_attr(const char *name,
88dd48c085SAkinobu Mita struct dentry *parent, struct fault_attr *attr)
896ff1cb35SAkinobu Mita {
90dd48c085SAkinobu Mita return ERR_PTR(-ENODEV);
916ff1cb35SAkinobu Mita }
926ff1cb35SAkinobu Mita
936ff1cb35SAkinobu Mita #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */
946ff1cb35SAkinobu Mita
954668c7a2SAkinobu Mita #ifdef CONFIG_FAULT_INJECTION_CONFIGFS
964668c7a2SAkinobu Mita
974668c7a2SAkinobu Mita struct fault_config {
984668c7a2SAkinobu Mita struct fault_attr attr;
994668c7a2SAkinobu Mita struct config_group group;
1004668c7a2SAkinobu Mita };
1014668c7a2SAkinobu Mita
1024668c7a2SAkinobu Mita void fault_config_init(struct fault_config *config, const char *name);
1034668c7a2SAkinobu Mita
1044668c7a2SAkinobu Mita #else /* CONFIG_FAULT_INJECTION_CONFIGFS */
1054668c7a2SAkinobu Mita
1064668c7a2SAkinobu Mita struct fault_config {
1074668c7a2SAkinobu Mita };
1084668c7a2SAkinobu Mita
fault_config_init(struct fault_config * config,const char * name)1094668c7a2SAkinobu Mita static inline void fault_config_init(struct fault_config *config,
1104668c7a2SAkinobu Mita const char *name)
1114668c7a2SAkinobu Mita {
1124668c7a2SAkinobu Mita }
1134668c7a2SAkinobu Mita
1144668c7a2SAkinobu Mita #endif /* CONFIG_FAULT_INJECTION_CONFIGFS */
1154668c7a2SAkinobu Mita
1160866e82eSKefeng Wang #ifdef CONFIG_FAIL_PAGE_ALLOC
11753dabce2SVlastimil Babka bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order);
1180866e82eSKefeng Wang #else
should_fail_alloc_page(gfp_t gfp_mask,unsigned int order)11953dabce2SVlastimil Babka static inline bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)
1200866e82eSKefeng Wang {
1210866e82eSKefeng Wang return false;
1220866e82eSKefeng Wang }
1230866e82eSKefeng Wang #endif /* CONFIG_FAIL_PAGE_ALLOC */
1240866e82eSKefeng Wang
125773ff60eSAkinobu Mita #ifdef CONFIG_FAILSLAB
126a7526fe8SVlastimil Babka int should_failslab(struct kmem_cache *s, gfp_t gfpflags);
127773ff60eSAkinobu Mita #else
should_failslab(struct kmem_cache * s,gfp_t gfpflags)128a7526fe8SVlastimil Babka static inline int should_failslab(struct kmem_cache *s, gfp_t gfpflags)
129773ff60eSAkinobu Mita {
130773ff60eSAkinobu Mita return false;
131773ff60eSAkinobu Mita }
132773ff60eSAkinobu Mita #endif /* CONFIG_FAILSLAB */
133773ff60eSAkinobu Mita
1346ff1cb35SAkinobu Mita #endif /* _LINUX_FAULT_INJECT_H */
135