1 #include <linux/fault-inject.h> 2 3 static struct { 4 struct fault_attr attr; 5 u32 ignore_gfp_wait; 6 #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS 7 struct dentry *ignore_gfp_wait_file; 8 #endif 9 } failslab = { 10 .attr = FAULT_ATTR_INITIALIZER, 11 .ignore_gfp_wait = 1, 12 }; 13 14 bool should_failslab(size_t size, gfp_t gfpflags) 15 { 16 if (gfpflags & __GFP_NOFAIL) 17 return false; 18 19 if (failslab.ignore_gfp_wait && (gfpflags & __GFP_WAIT)) 20 return false; 21 22 return should_fail(&failslab.attr, size); 23 } 24 25 static int __init setup_failslab(char *str) 26 { 27 return setup_fault_attr(&failslab.attr, str); 28 } 29 __setup("failslab=", setup_failslab); 30 31 #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS 32 33 static int __init failslab_debugfs_init(void) 34 { 35 mode_t mode = S_IFREG | S_IRUSR | S_IWUSR; 36 struct dentry *dir; 37 int err; 38 39 err = init_fault_attr_dentries(&failslab.attr, "failslab"); 40 if (err) 41 return err; 42 dir = failslab.attr.dentries.dir; 43 44 failslab.ignore_gfp_wait_file = 45 debugfs_create_bool("ignore-gfp-wait", mode, dir, 46 &failslab.ignore_gfp_wait); 47 48 if (!failslab.ignore_gfp_wait_file) { 49 err = -ENOMEM; 50 debugfs_remove(failslab.ignore_gfp_wait_file); 51 cleanup_fault_attr_dentries(&failslab.attr); 52 } 53 54 return err; 55 } 56 57 late_initcall(failslab_debugfs_init); 58 59 #endif /* CONFIG_FAULT_INJECTION_DEBUG_FS */ 60