f2fs: support fault injection for dquot_initialize()
authorChao Yu <chao@kernel.org>
Thu, 28 Oct 2021 13:03:05 +0000 (21:03 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 29 Oct 2021 17:38:53 +0000 (10:38 -0700)
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>
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 4294db649fa8270d2093537ff822b2ed8a01a387..6954c04753ad7c52a38732b95935f0d9d58b7b15 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 6f6a7d812d6098431904141bd9457663605c7d16..f1693d45bb782767f0b9c2fd40d77693a6a08bc5 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 c8c7d9e7dd7af469aa479a69bad0ff2724e42b02..ce9fc9f1300023956c48baca1ca58ff5a47052c6 100644 (file)
@@ -55,6 +55,7 @@ enum {
        FAULT_DISCARD,
        FAULT_WRITE_IO,
        FAULT_SLAB_ALLOC,
+       FAULT_DQUOT_INIT,
        FAULT_MAX,
 };
 
@@ -3376,6 +3377,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 9c8ef33bd8d32fe39610d4fd4cd3e5acc44b9345..abe7edc82582a986b6c68e98c101aa7caa54c8df 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;
        }
@@ -3020,7 +3020,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 1213f15ffd68c24c07a34862cb9f4ce5d084f56b..0f8b2df3e1e012ac49cedc3ce47bf3faeeb49ffe 100644 (file)
@@ -754,7 +754,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 706ddb3c95c0229a1cb6f481d4f7338b1a1b5a0f..6a1b4668d933aad629a4c4426a12429da1d66b87 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 989e76ec7fb2203ef9f68051a284c9dbf93a5624..75f706b91ebf1bf95e645386afd4e1b1c05a84a6 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,
@@ -2499,6 +2500,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;
@@ -2883,6 +2894,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 1d2d29dcd41ce0d3522a02abc61658097c8372f2..e348f33bcb2bea13cdfb7047b96e24c0f1d373ef 100644 (file)
@@ -773,7 +773,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;