Skip to content

Commit 10a2687

Browse files
chaseyuJaegeuk Kim
authored andcommitted
f2fs: support fault injection for dquot_initialize()
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 <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent ca98d72 commit 10a2687

File tree

11 files changed

+45
-26
lines changed

11 files changed

+45
-26
lines changed

Documentation/filesystems/f2fs.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ fault_type=%d Support configuring fault injection type, should be
197197
FAULT_DISCARD 0x000002000
198198
FAULT_WRITE_IO 0x000004000
199199
FAULT_SLAB_ALLOC 0x000008000
200+
FAULT_DQUOT_INIT 0x000010000
200201
=================== ===========
201202
mode=%s Control block allocation mode which supports "adaptive"
202203
and "lfs". In "lfs" mode, there should be no random

fs/f2fs/checkpoint.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,7 +653,7 @@ static int recover_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino)
653653
return PTR_ERR(inode);
654654
}
655655

656-
err = dquot_initialize(inode);
656+
err = f2fs_dquot_initialize(inode);
657657
if (err) {
658658
iput(inode);
659659
goto err_out;

fs/f2fs/f2fs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ enum {
5555
FAULT_DISCARD,
5656
FAULT_WRITE_IO,
5757
FAULT_SLAB_ALLOC,
58+
FAULT_DQUOT_INIT,
5859
FAULT_MAX,
5960
};
6061

@@ -3376,6 +3377,7 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode)
33763377
*/
33773378
int f2fs_inode_dirtied(struct inode *inode, bool sync);
33783379
void f2fs_inode_synced(struct inode *inode);
3380+
int f2fs_dquot_initialize(struct inode *inode);
33793381
int f2fs_enable_quota_files(struct f2fs_sb_info *sbi, bool rdonly);
33803382
int f2fs_quota_sync(struct super_block *sb, int type);
33813383
loff_t max_file_blocks(struct inode *inode);

fs/f2fs/file.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@ int f2fs_truncate(struct inode *inode)
786786
return -EIO;
787787
}
788788

789-
err = dquot_initialize(inode);
789+
err = f2fs_dquot_initialize(inode);
790790
if (err)
791791
return err;
792792

@@ -916,7 +916,7 @@ int f2fs_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
916916
return err;
917917

918918
if (is_quota_modification(inode, attr)) {
919-
err = dquot_initialize(inode);
919+
err = f2fs_dquot_initialize(inode);
920920
if (err)
921921
return err;
922922
}
@@ -3020,7 +3020,7 @@ static int f2fs_ioc_setproject(struct inode *inode, __u32 projid)
30203020
}
30213021
f2fs_put_page(ipage, 1);
30223022

3023-
err = dquot_initialize(inode);
3023+
err = f2fs_dquot_initialize(inode);
30243024
if (err)
30253025
return err;
30263026

fs/f2fs/inline.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ int f2fs_convert_inline_inode(struct inode *inode)
192192
f2fs_hw_is_readonly(sbi) || f2fs_readonly(sbi->sb))
193193
return 0;
194194

195-
err = dquot_initialize(inode);
195+
err = f2fs_dquot_initialize(inode);
196196
if (err)
197197
return err;
198198

fs/f2fs/inode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -754,7 +754,7 @@ void f2fs_evict_inode(struct inode *inode)
754754
if (inode->i_nlink || is_bad_inode(inode))
755755
goto no_delete;
756756

757-
err = dquot_initialize(inode);
757+
err = f2fs_dquot_initialize(inode);
758758
if (err) {
759759
err = 0;
760760
set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);

fs/f2fs/namei.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ static struct inode *f2fs_new_inode(struct inode *dir, umode_t mode)
7474
if (err)
7575
goto fail_drop;
7676

77-
err = dquot_initialize(inode);
77+
err = f2fs_dquot_initialize(inode);
7878
if (err)
7979
goto fail_drop;
8080

@@ -345,7 +345,7 @@ static int f2fs_create(struct user_namespace *mnt_userns, struct inode *dir,
345345
if (!f2fs_is_checkpoint_ready(sbi))
346346
return -ENOSPC;
347347

348-
err = dquot_initialize(dir);
348+
err = f2fs_dquot_initialize(dir);
349349
if (err)
350350
return err;
351351

@@ -404,7 +404,7 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir,
404404
F2FS_I(old_dentry->d_inode)->i_projid)))
405405
return -EXDEV;
406406

407-
err = dquot_initialize(dir);
407+
err = f2fs_dquot_initialize(dir);
408408
if (err)
409409
return err;
410410

@@ -460,7 +460,7 @@ static int __recover_dot_dentries(struct inode *dir, nid_t pino)
460460
return 0;
461461
}
462462

463-
err = dquot_initialize(dir);
463+
err = f2fs_dquot_initialize(dir);
464464
if (err)
465465
return err;
466466

@@ -598,10 +598,10 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry)
598598
goto fail;
599599
}
600600

601-
err = dquot_initialize(dir);
601+
err = f2fs_dquot_initialize(dir);
602602
if (err)
603603
goto fail;
604-
err = dquot_initialize(inode);
604+
err = f2fs_dquot_initialize(inode);
605605
if (err)
606606
goto fail;
607607

@@ -675,7 +675,7 @@ static int f2fs_symlink(struct user_namespace *mnt_userns, struct inode *dir,
675675
if (err)
676676
return err;
677677

678-
err = dquot_initialize(dir);
678+
err = f2fs_dquot_initialize(dir);
679679
if (err)
680680
return err;
681681

@@ -746,7 +746,7 @@ static int f2fs_mkdir(struct user_namespace *mnt_userns, struct inode *dir,
746746
if (unlikely(f2fs_cp_error(sbi)))
747747
return -EIO;
748748

749-
err = dquot_initialize(dir);
749+
err = f2fs_dquot_initialize(dir);
750750
if (err)
751751
return err;
752752

@@ -803,7 +803,7 @@ static int f2fs_mknod(struct user_namespace *mnt_userns, struct inode *dir,
803803
if (!f2fs_is_checkpoint_ready(sbi))
804804
return -ENOSPC;
805805

806-
err = dquot_initialize(dir);
806+
err = f2fs_dquot_initialize(dir);
807807
if (err)
808808
return err;
809809

@@ -841,7 +841,7 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,
841841
struct inode *inode;
842842
int err;
843843

844-
err = dquot_initialize(dir);
844+
err = f2fs_dquot_initialize(dir);
845845
if (err)
846846
return err;
847847

@@ -965,16 +965,16 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,
965965
return err;
966966
}
967967

968-
err = dquot_initialize(old_dir);
968+
err = f2fs_dquot_initialize(old_dir);
969969
if (err)
970970
goto out;
971971

972-
err = dquot_initialize(new_dir);
972+
err = f2fs_dquot_initialize(new_dir);
973973
if (err)
974974
goto out;
975975

976976
if (new_inode) {
977-
err = dquot_initialize(new_inode);
977+
err = f2fs_dquot_initialize(new_inode);
978978
if (err)
979979
goto out;
980980
}
@@ -1138,11 +1138,11 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry,
11381138
F2FS_I(new_dentry->d_inode)->i_projid)))
11391139
return -EXDEV;
11401140

1141-
err = dquot_initialize(old_dir);
1141+
err = f2fs_dquot_initialize(old_dir);
11421142
if (err)
11431143
goto out;
11441144

1145-
err = dquot_initialize(new_dir);
1145+
err = f2fs_dquot_initialize(new_dir);
11461146
if (err)
11471147
goto out;
11481148

fs/f2fs/recovery.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ static struct fsync_inode_entry *add_fsync_inode(struct f2fs_sb_info *sbi,
8181
if (IS_ERR(inode))
8282
return ERR_CAST(inode);
8383

84-
err = dquot_initialize(inode);
84+
err = f2fs_dquot_initialize(inode);
8585
if (err)
8686
goto err_out;
8787

@@ -203,7 +203,7 @@ static int recover_dentry(struct inode *inode, struct page *ipage,
203203
goto out_put;
204204
}
205205

206-
err = dquot_initialize(einode);
206+
err = f2fs_dquot_initialize(einode);
207207
if (err) {
208208
iput(einode);
209209
goto out_put;
@@ -508,7 +508,7 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi,
508508
if (IS_ERR(inode))
509509
return PTR_ERR(inode);
510510

511-
ret = dquot_initialize(inode);
511+
ret = f2fs_dquot_initialize(inode);
512512
if (ret) {
513513
iput(inode);
514514
return ret;

fs/f2fs/super.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ const char *f2fs_fault_name[FAULT_MAX] = {
5858
[FAULT_DISCARD] = "discard error",
5959
[FAULT_WRITE_IO] = "write IO error",
6060
[FAULT_SLAB_ALLOC] = "slab alloc",
61+
[FAULT_DQUOT_INIT] = "dquot initialize",
6162
};
6263

6364
void f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned int rate,
@@ -2499,6 +2500,16 @@ static ssize_t f2fs_quota_write(struct super_block *sb, int type,
24992500
return len - towrite;
25002501
}
25012502

2503+
int f2fs_dquot_initialize(struct inode *inode)
2504+
{
2505+
if (time_to_inject(F2FS_I_SB(inode), FAULT_DQUOT_INIT)) {
2506+
f2fs_show_injection_info(F2FS_I_SB(inode), FAULT_DQUOT_INIT);
2507+
return -ESRCH;
2508+
}
2509+
2510+
return dquot_initialize(inode);
2511+
}
2512+
25022513
static struct dquot **f2fs_get_dquots(struct inode *inode)
25032514
{
25042515
return F2FS_I(inode)->i_dquot;
@@ -2883,6 +2894,11 @@ static const struct quotactl_ops f2fs_quotactl_ops = {
28832894
.get_nextdqblk = dquot_get_next_dqblk,
28842895
};
28852896
#else
2897+
int f2fs_dquot_initialize(struct inode *inode)
2898+
{
2899+
return 0;
2900+
}
2901+
28862902
int f2fs_quota_sync(struct super_block *sb, int type)
28872903
{
28882904
return 0;

fs/f2fs/verity.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static int f2fs_begin_enable_verity(struct file *filp)
136136
* here and not rely on ->open() doing it. This must be done before
137137
* evicting the inline data.
138138
*/
139-
err = dquot_initialize(inode);
139+
err = f2fs_dquot_initialize(inode);
140140
if (err)
141141
return err;
142142

0 commit comments

Comments
 (0)