f2fs: support fault injection for dquot_initialize()
authorChao Yu <chao@kernel.org>
Thu, 28 Oct 2021 13:03:05 +0000 (21:03 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 9 Jun 2022 08:23:13 +0000 (10:23 +0200)
[ Upstream commit 10a26878564f27327b12e8f4b4d8d7b43065fae5 ]

This patch adds a new function f2fs_dquot_initialize() to wrap
dquot_initialize(), and it supports to inject fault into
f2fs_dquot_initialize() to simulate inner failure occurs in
dquot_initialize().

Usage:
a) echo 65536 > /sys/fs/f2fs/<dev>/inject_type or
b) mount -o fault_type=65536 <dev> <mountpoint>

Signed-off-by: Chao Yu <chao@kernel.org>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Documentation/filesystems/f2fs.rst
fs/f2fs/checkpoint.c
fs/f2fs/f2fs.h
fs/f2fs/file.c
fs/f2fs/inline.c
fs/f2fs/inode.c
fs/f2fs/namei.c
fs/f2fs/recovery.c
fs/f2fs/super.c
fs/f2fs/verity.c
fs/f2fs/xattr.c

index 09de6ebbbdfa2d6c9d28d1db002bc7d3a69a7bc7..7fe50b0bccde910b16b650855b354301ec7b99ed 100644 (file)
@@ -197,6 +197,7 @@ fault_type=%d                Support configuring fault injection type, should be
                         FAULT_DISCARD            0x000002000
                         FAULT_WRITE_IO           0x000004000
                         FAULT_SLAB_ALLOC         0x000008000
+                        FAULT_DQUOT_INIT         0x000010000
                         ===================      ===========
 mode=%s                         Control block allocation mode which supports "adaptive"
                         and "lfs". In "lfs" mode, there should be no random
index 1ff32926e1999daa26a954f2a3687b12f21b8043..70d898ad2d1de6daf1b737a1aa4333409ba19b25 100644 (file)
@@ -653,7 +653,7 @@ static int recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
                return PTR_ERR(inode);
        }
 
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err) {
                iput(inode);
                goto err_out;
index 0a0fa1a64d06ec0f4c7f784287298e8fda2c580a..d775048d436677875840f7c721e3443e82ec0bd3 100644 (file)
@@ -55,6 +55,7 @@ enum {
        FAULT_DISCARD,
        FAULT_WRITE_IO,
        FAULT_SLAB_ALLOC,
+       FAULT_DQUOT_INIT,
        FAULT_MAX,
 };
 
@@ -3375,6 +3376,7 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)
  */
 int f2fs_inode_dirtied(struct inode *inode, bool sync);
 void f2fs_inode_synced(struct inode *inode);
+int f2fs_dquot_initialize(struct inode *inode);
 int f2fs_enable_quota_files(struct f2fs_sb_info *sbi, bool rdonly);
 int f2fs_quota_sync(struct super_block *sb, int type);
 loff_t max_file_blocks(struct inode *inode);
index 8ef92719c6799dc1253709dabb11fca775f2dcc6..21dde125ff77d6ec45f2461505966dace42a749d 100644 (file)
@@ -786,7 +786,7 @@ int f2fs_truncate(struct inode *inode)
                return -EIO;
        }
 
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err)
                return err;
 
@@ -916,7 +916,7 @@ int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                return err;
 
        if (is_quota_modification(inode, attr)) {
-               err = dquot_initialize(inode);
+               err = f2fs_dquot_initialize(inode);
                if (err)
                        return err;
        }
@@ -3023,7 +3023,7 @@ static int f2fs_ioc_setproject(struct inode *inode, __u32 projid)
        }
        f2fs_put_page(ipage, 1);
 
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err)
                return err;
 
index 56a20d5c15dad0b4b5c20bbd68faffe46b15233d..ea08f0dfa1bdff58ad9c3d5f35d3a8d1d31d69f7 100644 (file)
@@ -192,7 +192,7 @@ int f2fs_convert_inline_inode(struct inode *inode)
                        f2fs_hw_is_readonly(sbi) || f2fs_readonly(sbi->sb))
                return 0;
 
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err)
                return err;
 
index 2272000fb10b5c2441908b3136ec0edfc8f9dd13..a40e52ba5ec84d272cdef0d4875907d1efa4d7cd 100644 (file)
@@ -759,7 +759,7 @@ void f2fs_evict_inode(struct inode *inode)
        if (inode->i_nlink || is_bad_inode(inode))
                goto no_delete;
 
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err) {
                err = 0;
                set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
index ae0838001480a40ca4e6726659b34f9b523a30c4..a728a0af9ce0c853427d014d10d89ea3e7a98311 100644 (file)
@@ -74,7 +74,7 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
        if (err)
                goto fail_drop;
 
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err)
                goto fail_drop;
 
@@ -345,7 +345,7 @@ static int f2fs_create(struct user_namespace *mnt_userns, struct inode *dir,
        if (!f2fs_is_checkpoint_ready(sbi))
                return -ENOSPC;
 
-       err = dquot_initialize(dir);
+       err = f2fs_dquot_initialize(dir);
        if (err)
                return err;
 
@@ -404,7 +404,7 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
                        F2FS_I(old_dentry->d_inode)->i_projid)))
                return -EXDEV;
 
-       err = dquot_initialize(dir);
+       err = f2fs_dquot_initialize(dir);
        if (err)
                return err;
 
@@ -460,7 +460,7 @@ static int __recover_dot_dentries(struct inode *dir, nid_t pino)
                return 0;
        }
 
-       err = dquot_initialize(dir);
+       err = f2fs_dquot_initialize(dir);
        if (err)
                return err;
 
@@ -598,10 +598,10 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
                goto fail;
        }
 
-       err = dquot_initialize(dir);
+       err = f2fs_dquot_initialize(dir);
        if (err)
                goto fail;
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err)
                goto fail;
 
@@ -675,7 +675,7 @@ static int f2fs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
        if (err)
                return err;
 
-       err = dquot_initialize(dir);
+       err = f2fs_dquot_initialize(dir);
        if (err)
                return err;
 
@@ -746,7 +746,7 @@ static int f2fs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
        if (unlikely(f2fs_cp_error(sbi)))
                return -EIO;
 
-       err = dquot_initialize(dir);
+       err = f2fs_dquot_initialize(dir);
        if (err)
                return err;
 
@@ -803,7 +803,7 @@ static int f2fs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
        if (!f2fs_is_checkpoint_ready(sbi))
                return -ENOSPC;
 
-       err = dquot_initialize(dir);
+       err = f2fs_dquot_initialize(dir);
        if (err)
                return err;
 
@@ -841,7 +841,7 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,
        struct inode *inode;
        int err;
 
-       err = dquot_initialize(dir);
+       err = f2fs_dquot_initialize(dir);
        if (err)
                return err;
 
@@ -965,16 +965,16 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
                        return err;
        }
 
-       err = dquot_initialize(old_dir);
+       err = f2fs_dquot_initialize(old_dir);
        if (err)
                goto out;
 
-       err = dquot_initialize(new_dir);
+       err = f2fs_dquot_initialize(new_dir);
        if (err)
                goto out;
 
        if (new_inode) {
-               err = dquot_initialize(new_inode);
+               err = f2fs_dquot_initialize(new_inode);
                if (err)
                        goto out;
        }
@@ -1138,11 +1138,11 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
                        F2FS_I(new_dentry->d_inode)->i_projid)))
                return -EXDEV;
 
-       err = dquot_initialize(old_dir);
+       err = f2fs_dquot_initialize(old_dir);
        if (err)
                goto out;
 
-       err = dquot_initialize(new_dir);
+       err = f2fs_dquot_initialize(new_dir);
        if (err)
                goto out;
 
index 04655511d7f514593d388ef88bd6ac4be17b4988..66b75bc6a60a765224d96525302861443f3d1baf 100644 (file)
@@ -81,7 +81,7 @@ static struct fsync_inode_entry *add_fsync_inode(struct f2fs_sb_info *sbi,
        if (IS_ERR(inode))
                return ERR_CAST(inode);
 
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err)
                goto err_out;
 
@@ -203,7 +203,7 @@ retry:
                        goto out_put;
                }
 
-               err = dquot_initialize(einode);
+               err = f2fs_dquot_initialize(einode);
                if (err) {
                        iput(einode);
                        goto out_put;
@@ -508,7 +508,7 @@ got_it:
                if (IS_ERR(inode))
                        return PTR_ERR(inode);
 
-               ret = dquot_initialize(inode);
+               ret = f2fs_dquot_initialize(inode);
                if (ret) {
                        iput(inode);
                        return ret;
index 6dc66b7bc1f580398aee3d2b1751596e9a055dea..d41081aae2e5505d6e0fb6233d20baa4a1c40bdc 100644 (file)
@@ -58,6 +58,7 @@ const char *f2fs_fault_name[FAULT_MAX] = {
        [FAULT_DISCARD]         = "discard error",
        [FAULT_WRITE_IO]        = "write IO error",
        [FAULT_SLAB_ALLOC]      = "slab alloc",
+       [FAULT_DQUOT_INIT]      = "dquot initialize",
 };
 
 void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
@@ -2535,6 +2536,16 @@ retry:
        return len - towrite;
 }
 
+int f2fs_dquot_initialize(struct inode *inode)
+{
+       if (time_to_inject(F2FS_I_SB(inode), FAULT_DQUOT_INIT)) {
+               f2fs_show_injection_info(F2FS_I_SB(inode), FAULT_DQUOT_INIT);
+               return -ESRCH;
+       }
+
+       return dquot_initialize(inode);
+}
+
 static struct dquot **f2fs_get_dquots(struct inode *inode)
 {
        return F2FS_I(inode)->i_dquot;
@@ -2919,6 +2930,11 @@ static const struct quotactl_ops f2fs_quotactl_ops = {
        .get_nextdqblk  = dquot_get_next_dqblk,
 };
 #else
+int f2fs_dquot_initialize(struct inode *inode)
+{
+       return 0;
+}
+
 int f2fs_quota_sync(struct super_block *sb, int type)
 {
        return 0;
index 03549b5ba204ab38f48149148a6071764ace3a8e..fe5acdccaae1970e6e5cef55a840b99fc9af153c 100644 (file)
@@ -136,7 +136,7 @@ static int f2fs_begin_enable_verity(struct file *filp)
         * here and not rely on ->open() doing it.  This must be done before
         * evicting the inline data.
         */
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err)
                return err;
 
index 6a3b3bec7989d7d1d548a7a8db999d7d94583ebf..797ac505a075ad075237af6cca20b0c1707288f2 100644 (file)
@@ -782,7 +782,7 @@ int f2fs_setxattr(struct inode *inode, int index, const char *name,
        if (!f2fs_is_checkpoint_ready(sbi))
                return -ENOSPC;
 
-       err = dquot_initialize(inode);
+       err = f2fs_dquot_initialize(inode);
        if (err)
                return err;