return ERR_PTR(-EINVAL);
 }
 
-static void *f2fs_acl_to_disk(const struct posix_acl *acl, size_t *size)
+static void *f2fs_acl_to_disk(struct f2fs_sb_info *sbi,
+                               const struct posix_acl *acl, size_t *size)
 {
        struct f2fs_acl_header *f2fs_acl;
        struct f2fs_acl_entry *entry;
        int i;
 
-       f2fs_acl = f2fs_kmalloc(sizeof(struct f2fs_acl_header) + acl->a_count *
-                       sizeof(struct f2fs_acl_entry), GFP_NOFS);
+       f2fs_acl = f2fs_kmalloc(sbi, sizeof(struct f2fs_acl_header) +
+                       acl->a_count * sizeof(struct f2fs_acl_entry),
+                       GFP_NOFS);
        if (!f2fs_acl)
                return ERR_PTR(-ENOMEM);
 
 
        retval = f2fs_getxattr(inode, name_index, "", NULL, 0, dpage);
        if (retval > 0) {
-               value = f2fs_kmalloc(retval, GFP_F2FS_ZERO);
+               value = f2fs_kmalloc(F2FS_I_SB(inode), retval, GFP_F2FS_ZERO);
                if (!value)
                        return ERR_PTR(-ENOMEM);
                retval = f2fs_getxattr(inode, name_index, "", value,
        }
 
        if (acl) {
-               value = f2fs_acl_to_disk(acl, &size);
+               value = f2fs_acl_to_disk(F2FS_I_SB(inode), acl, &size);
                if (IS_ERR(value)) {
                        clear_inode_flag(inode, FI_ACL_MODE);
                        return (int)PTR_ERR(value);
 
        spin_lock(&im->ino_lock);
 
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (time_to_inject(FAULT_ORPHAN)) {
+       if (time_to_inject(sbi, FAULT_ORPHAN)) {
                spin_unlock(&im->ino_lock);
                return -ENOSPC;
        }
 
        int i;
 
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (time_to_inject(FAULT_IO))
+       if (time_to_inject(F2FS_P_SB(bio->bi_io_vec->bv_page), FAULT_IO))
                bio->bi_error = -EIO;
 #endif
 
 
 
 start:
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (time_to_inject(FAULT_DIR_DEPTH))
+       if (time_to_inject(F2FS_I_SB(dir), FAULT_DIR_DEPTH))
                return -ENOSPC;
 #endif
        if (unlikely(current_depth == MAX_DIR_HASH_DEPTH))
 
        unsigned int inject_type;
 };
 
-extern struct f2fs_fault_info f2fs_fault;
 extern char *fault_name[FAULT_MAX];
-#define IS_FAULT_SET(type) (f2fs_fault.inject_type & (1 << (type)))
-
-static inline bool time_to_inject(int type)
-{
-       if (!f2fs_fault.inject_rate)
-               return false;
-       if (type == FAULT_KMALLOC && !IS_FAULT_SET(type))
-               return false;
-       else if (type == FAULT_PAGE_ALLOC && !IS_FAULT_SET(type))
-               return false;
-       else if (type == FAULT_ALLOC_NID && !IS_FAULT_SET(type))
-               return false;
-       else if (type == FAULT_ORPHAN && !IS_FAULT_SET(type))
-               return false;
-       else if (type == FAULT_BLOCK && !IS_FAULT_SET(type))
-               return false;
-       else if (type == FAULT_DIR_DEPTH && !IS_FAULT_SET(type))
-               return false;
-       else if (type == FAULT_EVICT_INODE && !IS_FAULT_SET(type))
-               return false;
-       else if (type == FAULT_IO && !IS_FAULT_SET(type))
-               return false;
-
-       atomic_inc(&f2fs_fault.inject_ops);
-       if (atomic_read(&f2fs_fault.inject_ops) >= f2fs_fault.inject_rate) {
-               atomic_set(&f2fs_fault.inject_ops, 0);
-               printk("%sF2FS-fs : inject %s in %pF\n",
-                               KERN_INFO,
-                               fault_name[type],
-                               __builtin_return_address(0));
-               return true;
-       }
-       return false;
-}
+#define IS_FAULT_SET(fi, type) (fi->inject_type & (1 << (type)))
 #endif
 
 /*
 
        /* Reference to checksum algorithm driver via cryptoapi */
        struct crypto_shash *s_chksum_driver;
+
+       /* For fault injection */
+#ifdef CONFIG_F2FS_FAULT_INJECTION
+       struct f2fs_fault_info fault_info;
+#endif
 };
 
+#ifdef CONFIG_F2FS_FAULT_INJECTION
+static inline bool time_to_inject(struct f2fs_sb_info *sbi, int type)
+{
+       struct f2fs_fault_info *ffi = &sbi->fault_info;
+
+       if (!ffi->inject_rate)
+               return false;
+
+       if (!IS_FAULT_SET(ffi, type))
+               return false;
+
+       atomic_inc(&ffi->inject_ops);
+       if (atomic_read(&ffi->inject_ops) >= ffi->inject_rate) {
+               atomic_set(&ffi->inject_ops, 0);
+               printk("%sF2FS-fs : inject %s in %pF\n",
+                               KERN_INFO,
+                               fault_name[type],
+                               __builtin_return_address(0));
+               return true;
+       }
+       return false;
+}
+#endif
+
 /* For write statistics. Suppose sector size is 512 bytes,
  * and the return value is in kbytes. s is of struct f2fs_sb_info.
  */
        blkcnt_t diff;
 
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (time_to_inject(FAULT_BLOCK))
+       if (time_to_inject(sbi, FAULT_BLOCK))
                return false;
 #endif
        /*
        if (page)
                return page;
 
-       if (time_to_inject(FAULT_PAGE_ALLOC))
+       if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_ALLOC))
                return NULL;
 #endif
        if (!for_write)
        return S_ISREG(inode->i_mode);
 }
 
-static inline void *f2fs_kmalloc(size_t size, gfp_t flags)
+static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi,
+                                       size_t size, gfp_t flags)
 {
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (time_to_inject(FAULT_KMALLOC))
+       if (time_to_inject(sbi, FAULT_KMALLOC))
                return NULL;
 #endif
        return kmalloc(size, flags);
 
        dev_t dev = sbi->sb->s_bdev->bd_dev;
        int err = 0;
 
-       gc_th = f2fs_kmalloc(sizeof(struct f2fs_gc_kthread), GFP_KERNEL);
+       gc_th = f2fs_kmalloc(sbi, sizeof(struct f2fs_gc_kthread), GFP_KERNEL);
        if (!gc_th) {
                err = -ENOMEM;
                goto out;
 
        struct f2fs_inline_dentry *backup_dentry;
        int err;
 
-       backup_dentry = f2fs_kmalloc(sizeof(struct f2fs_inline_dentry),
-                                                       GFP_F2FS_ZERO);
+       backup_dentry = f2fs_kmalloc(F2FS_I_SB(dir),
+                       sizeof(struct f2fs_inline_dentry), GFP_F2FS_ZERO);
        if (!backup_dentry) {
                f2fs_put_page(ipage, 1);
                return -ENOMEM;
 
                goto no_delete;
 
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (time_to_inject(FAULT_EVICT_INODE))
+       if (time_to_inject(sbi, FAULT_EVICT_INODE))
                goto no_delete;
 #endif
 
 
        struct free_nid *i = NULL;
 retry:
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (time_to_inject(FAULT_ALLOC_NID))
+       if (time_to_inject(sbi, FAULT_ALLOC_NID))
                return false;
 #endif
        if (unlikely(sbi->total_valid_node_count + 1 > nm_i->available_nids))
 
 static struct kset *f2fs_kset;
 
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-struct f2fs_fault_info f2fs_fault;
 
 char *fault_name[FAULT_MAX] = {
        [FAULT_KMALLOC]         = "kmalloc",
        [FAULT_IO]              = "IO error",
 };
 
-static void f2fs_build_fault_attr(unsigned int rate)
+static void f2fs_build_fault_attr(struct f2fs_sb_info *sbi,
+                                               unsigned int rate)
 {
+       struct f2fs_fault_info *ffi = &sbi->fault_info;
+
        if (rate) {
-               atomic_set(&f2fs_fault.inject_ops, 0);
-               f2fs_fault.inject_rate = rate;
-               f2fs_fault.inject_type = (1 << FAULT_MAX) - 1;
+               atomic_set(&ffi->inject_ops, 0);
+               ffi->inject_rate = rate;
+               ffi->inject_type = (1 << FAULT_MAX) - 1;
        } else {
-               memset(&f2fs_fault, 0, sizeof(struct f2fs_fault_info));
+               memset(ffi, 0, sizeof(struct f2fs_fault_info));
        }
 }
 #endif
 #ifdef CONFIG_F2FS_FAULT_INJECTION
        else if (struct_type == FAULT_INFO_RATE ||
                                        struct_type == FAULT_INFO_TYPE)
-               return (unsigned char *)&f2fs_fault;
+               return (unsigned char *)&sbi->fault_info;
 #endif
        return NULL;
 }
        ATTR_LIST(dirty_nats_ratio),
        ATTR_LIST(cp_interval),
        ATTR_LIST(idle_interval),
+#ifdef CONFIG_F2FS_FAULT_INJECTION
+       ATTR_LIST(inject_rate),
+       ATTR_LIST(inject_type),
+#endif
        ATTR_LIST(lifetime_write_kbytes),
        NULL,
 };
        .release        = f2fs_sb_release,
 };
 
-#ifdef CONFIG_F2FS_FAULT_INJECTION
-/* sysfs for f2fs fault injection */
-static struct kobject f2fs_fault_inject;
-
-static struct attribute *f2fs_fault_attrs[] = {
-       ATTR_LIST(inject_rate),
-       ATTR_LIST(inject_type),
-       NULL
-};
-
-static struct kobj_type f2fs_fault_ktype = {
-       .default_attrs  = f2fs_fault_attrs,
-       .sysfs_ops      = &f2fs_attr_ops,
-};
-#endif
-
 void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...)
 {
        struct va_format vaf;
        int arg = 0;
 
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       f2fs_build_fault_attr(0);
+       f2fs_build_fault_attr(sbi, 0);
 #endif
 
        if (!options)
                        if (args->from && match_int(args, &arg))
                                return -EINVAL;
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-                       f2fs_build_fault_attr(arg);
+                       f2fs_build_fault_attr(sbi, arg);
 #else
                        f2fs_msg(sb, KERN_INFO,
                                "FAULT_INJECTION was not selected");
                err = -ENOMEM;
                goto free_extent_cache;
        }
-#ifdef CONFIG_F2FS_FAULT_INJECTION
-       f2fs_fault_inject.kset = f2fs_kset;
-       f2fs_build_fault_attr(0);
-       err = kobject_init_and_add(&f2fs_fault_inject, &f2fs_fault_ktype,
-                               NULL, "fault_injection");
-       if (err) {
-               f2fs_fault_inject.kset = NULL;
-               goto free_kset;
-       }
-#endif
        err = register_shrinker(&f2fs_shrinker_info);
        if (err)
                goto free_kset;
 free_shrinker:
        unregister_shrinker(&f2fs_shrinker_info);
 free_kset:
-#ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (f2fs_fault_inject.kset)
-               kobject_put(&f2fs_fault_inject);
-#endif
        kset_unregister(f2fs_kset);
 free_extent_cache:
        destroy_extent_cache();
        f2fs_destroy_root_stats();
        unregister_filesystem(&f2fs_fs_type);
        unregister_shrinker(&f2fs_shrinker_info);
-#ifdef CONFIG_F2FS_FAULT_INJECTION
-       kobject_put(&f2fs_fault_inject);
-#endif
        kset_unregister(f2fs_kset);
        destroy_extent_cache();
        destroy_checkpoint_caches();