Update to 3.4-final.
[linux-flexiantxendom0-3.2.10.git] / mm / failslab.c
index 7c6ea64..fefaaba 100644 (file)
@@ -1,17 +1,17 @@
 #include <linux/fault-inject.h>
+#include <linux/slab.h>
 
 static struct {
        struct fault_attr attr;
        u32 ignore_gfp_wait;
-#ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
-       struct dentry *ignore_gfp_wait_file;
-#endif
+       int cache_filter;
 } failslab = {
        .attr = FAULT_ATTR_INITIALIZER,
        .ignore_gfp_wait = 1,
+       .cache_filter = 0,
 };
 
-bool should_failslab(size_t size, gfp_t gfpflags)
+bool should_failslab(size_t size, gfp_t gfpflags, unsigned long cache_flags)
 {
        if (gfpflags & __GFP_NOFAIL)
                return false;
@@ -19,6 +19,9 @@ bool should_failslab(size_t size, gfp_t gfpflags)
         if (failslab.ignore_gfp_wait && (gfpflags & __GFP_WAIT))
                return false;
 
+       if (failslab.cache_filter && !(cache_flags & SLAB_FAILSLAB))
+               return false;
+
        return should_fail(&failslab.attr, size);
 }
 
@@ -29,29 +32,27 @@ static int __init setup_failslab(char *str)
 __setup("failslab=", setup_failslab);
 
 #ifdef CONFIG_FAULT_INJECTION_DEBUG_FS
-
 static int __init failslab_debugfs_init(void)
 {
-       mode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
        struct dentry *dir;
-       int err;
+       umode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
 
-       err = init_fault_attr_dentries(&failslab.attr, "failslab");
-       if (err)
-               return err;
-       dir = failslab.attr.dentries.dir;
+       dir = fault_create_debugfs_attr("failslab", NULL, &failslab.attr);
+       if (IS_ERR(dir))
+               return PTR_ERR(dir);
 
-       failslab.ignore_gfp_wait_file =
-               debugfs_create_bool("ignore-gfp-wait", mode, dir,
-                                     &failslab.ignore_gfp_wait);
+       if (!debugfs_create_bool("ignore-gfp-wait", mode, dir,
+                               &failslab.ignore_gfp_wait))
+               goto fail;
+       if (!debugfs_create_bool("cache-filter", mode, dir,
+                               &failslab.cache_filter))
+               goto fail;
 
-       if (!failslab.ignore_gfp_wait_file) {
-               err = -ENOMEM;
-               debugfs_remove(failslab.ignore_gfp_wait_file);
-               cleanup_fault_attr_dentries(&failslab.attr);
-       }
+       return 0;
+fail:
+       debugfs_remove_recursive(dir);
 
-       return err;
+       return -ENOMEM;
 }
 
 late_initcall(failslab_debugfs_init);