Skip to content

Commit 2be96c2

Browse files
chaseyuJaegeuk Kim
authored andcommitted
f2fs: fix to update injection attrs according to fault_option
When we update inject type via sysfs, it shows wrong rate value as below, there is a same problem when we update inject rate, fix it. Before: F2FS-fs (vdd): build fault injection attr: rate: 0, type: 0xffff F2FS-fs (vdd): build fault injection attr: rate: 1, type: 0x0 After: F2FS-fs (vdd): build fault injection type: 0x1 F2FS-fs (vdd): build fault injection rate: 1 Meanwhile, let's avoid turning on all fault types when we enable fault injection via fault_injection mount option, it will lead to shutdown filesystem or fail the mount() easily. mount -o fault_injection=4 /dev/vdd /mnt/f2fs F2FS-fs (vdd): build fault injection attr: rate: 4, type: 0x7fffff F2FS-fs (vdd): inject kmalloc in f2fs_kmalloc of f2fs_fill_super+0xbdf/0x27c0 Signed-off-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent e073e92 commit 2be96c2

File tree

4 files changed

+26
-20
lines changed

4 files changed

+26
-20
lines changed

fs/f2fs/checkpoint.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ struct kmem_cache *f2fs_inode_entry_slab;
2929
void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io,
3030
unsigned char reason)
3131
{
32-
f2fs_build_fault_attr(sbi, 0, 0);
32+
f2fs_build_fault_attr(sbi, 0, 0, FAULT_ALL);
3333
if (!end_io)
3434
f2fs_flush_merged_writes(sbi);
3535
f2fs_handle_critical_error(sbi, reason);

fs/f2fs/f2fs.h

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,14 @@ enum {
6666
FAULT_MAX,
6767
};
6868

69-
#ifdef CONFIG_F2FS_FAULT_INJECTION
70-
#define F2FS_ALL_FAULT_TYPE (GENMASK(FAULT_MAX - 1, 0))
69+
/* indicate which option to update */
70+
enum fault_option {
71+
FAULT_RATE = 1, /* only update fault rate */
72+
FAULT_TYPE = 2, /* only update fault type */
73+
FAULT_ALL = 4, /* reset all fault injection options/stats */
74+
};
7175

76+
#ifdef CONFIG_F2FS_FAULT_INJECTION
7277
struct f2fs_fault_info {
7378
atomic_t inject_ops;
7479
int inject_rate;
@@ -4765,10 +4770,11 @@ static inline bool f2fs_need_verity(const struct inode *inode, pgoff_t idx)
47654770

47664771
#ifdef CONFIG_F2FS_FAULT_INJECTION
47674772
extern int f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned long rate,
4768-
unsigned long type);
4773+
unsigned long type, enum fault_option fo);
47694774
#else
47704775
static inline int f2fs_build_fault_attr(struct f2fs_sb_info *sbi,
4771-
unsigned long rate, unsigned long type)
4776+
unsigned long rate, unsigned long type,
4777+
enum fault_option fo)
47724778
{
47734779
return 0;
47744780
}

fs/f2fs/super.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,29 +68,30 @@ const char *f2fs_fault_name[FAULT_MAX] = {
6868
};
6969

7070
int f2fs_build_fault_attr(struct f2fs_sb_info *sbi, unsigned long rate,
71-
unsigned long type)
71+
unsigned long type, enum fault_option fo)
7272
{
7373
struct f2fs_fault_info *ffi = &F2FS_OPTION(sbi).fault_info;
7474

75-
if (rate) {
75+
if (fo & FAULT_ALL) {
76+
memset(ffi, 0, sizeof(struct f2fs_fault_info));
77+
return 0;
78+
}
79+
80+
if (fo & FAULT_RATE) {
7681
if (rate > INT_MAX)
7782
return -EINVAL;
7883
atomic_set(&ffi->inject_ops, 0);
7984
ffi->inject_rate = (int)rate;
85+
f2fs_info(sbi, "build fault injection rate: %lu", rate);
8086
}
8187

82-
if (type) {
88+
if (fo & FAULT_TYPE) {
8389
if (type >= BIT(FAULT_MAX))
8490
return -EINVAL;
8591
ffi->inject_type = (unsigned int)type;
92+
f2fs_info(sbi, "build fault injection type: 0x%lx", type);
8693
}
8794

88-
if (!rate && !type)
89-
memset(ffi, 0, sizeof(struct f2fs_fault_info));
90-
else
91-
f2fs_info(sbi,
92-
"build fault injection attr: rate: %lu, type: 0x%lx",
93-
rate, type);
9495
return 0;
9596
}
9697
#endif
@@ -897,16 +898,15 @@ static int parse_options(struct f2fs_sb_info *sbi, char *options, bool is_remoun
897898
case Opt_fault_injection:
898899
if (args->from && match_int(args, &arg))
899900
return -EINVAL;
900-
if (f2fs_build_fault_attr(sbi, arg,
901-
F2FS_ALL_FAULT_TYPE))
901+
if (f2fs_build_fault_attr(sbi, arg, 0, FAULT_RATE))
902902
return -EINVAL;
903903
set_opt(sbi, FAULT_INJECTION);
904904
break;
905905

906906
case Opt_fault_type:
907907
if (args->from && match_int(args, &arg))
908908
return -EINVAL;
909-
if (f2fs_build_fault_attr(sbi, 0, arg))
909+
if (f2fs_build_fault_attr(sbi, 0, arg, FAULT_TYPE))
910910
return -EINVAL;
911911
set_opt(sbi, FAULT_INJECTION);
912912
break;
@@ -2209,7 +2209,7 @@ static void default_options(struct f2fs_sb_info *sbi, bool remount)
22092209
set_opt(sbi, POSIX_ACL);
22102210
#endif
22112211

2212-
f2fs_build_fault_attr(sbi, 0, 0);
2212+
f2fs_build_fault_attr(sbi, 0, 0, FAULT_ALL);
22132213
}
22142214

22152215
#ifdef CONFIG_QUOTA

fs/f2fs/sysfs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,12 +494,12 @@ static ssize_t __sbi_store(struct f2fs_attr *a,
494494
return ret;
495495
#ifdef CONFIG_F2FS_FAULT_INJECTION
496496
if (a->struct_type == FAULT_INFO_TYPE) {
497-
if (f2fs_build_fault_attr(sbi, 0, t))
497+
if (f2fs_build_fault_attr(sbi, 0, t, FAULT_TYPE))
498498
return -EINVAL;
499499
return count;
500500
}
501501
if (a->struct_type == FAULT_INFO_RATE) {
502-
if (f2fs_build_fault_attr(sbi, t, 0))
502+
if (f2fs_build_fault_attr(sbi, t, 0, FAULT_RATE))
503503
return -EINVAL;
504504
return count;
505505
}

0 commit comments

Comments
 (0)