[PATCH] erofs: surround fault_injection ralted option parsing using CONFIG_EROFS_FAULT_INJECTION
Gao Xiang
gaoxiang25 at huawei.com
Tue Sep 11 02:37:06 AEST 2018
Hi Greg,
On 2018/9/10 23:52, Greg KH wrote:
> On Mon, Sep 10, 2018 at 11:45:51PM +0800, Chengguang Xu wrote:
>> It's a little bit strange when fault_injection related
>> option fail with -EINVAL which was already disabled
>> from config, so surround all fault_injection related option
>> parsing code using CONFIG_EROFS_FAULT_INJECTION. Meanwhile,
>> slightly change warning message to keep consistency with
>> option POSIX_ACL and FS_XATTR.
>>
>> Signed-off-by: Chengguang Xu <cgxu519 at gmx.com>
>> ---
>> drivers/staging/erofs/super.c | 8 +++++---
>> 1 file changed, 5 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/staging/erofs/super.c b/drivers/staging/erofs/super.c
>> index 1aec509c805f..4004a00d150d 100644
>> --- a/drivers/staging/erofs/super.c
>> +++ b/drivers/staging/erofs/super.c
>> @@ -237,16 +237,18 @@ static int parse_options(struct super_block *sb, char *options)
>> infoln("noacl options not supported");
>> break;
>> #endif
>> +#ifdef CONFIG_EROFS_FAULT_INJECTION
>> case Opt_fault_injection:
>> if (args->from && match_int(args, &arg))
>> return -EINVAL;
>> -#ifdef CONFIG_EROFS_FAULT_INJECTION
>> erofs_build_fault_attr(EROFS_SB(sb), arg);
>> set_opt(EROFS_SB(sb), FAULT_INJECTION);
>> + break;
>> #else
>> - infoln("FAULT_INJECTION was not selected");
>> -#endif
>> + case Opt_fault_injection:
>> + infoln("FAULT_INJECTION not supported");
>> break;
>> +#endif
>
> Ugh, that's hard to read. Why not just hide all of this crazyness
> behind a single function that handles the #ifdef mess, like it should
> be. Then just always call handle_fault_injection() or whatever you want
> to call it.
>
> That makes it easier to read and understand and maintain over time.
>
> I'll take this for now, but that should be something you work on
> eventually. For the other #ifdef options in here as well.
Yeah, I agree your point and it needs to be cleaned up. :) it is now ext2/f2fs-like uhh...
fs/ext2/super.c
...
293 #ifdef CONFIG_EXT2_FS_XATTR
294 if (test_opt(sb, XATTR_USER))
295 seq_puts(seq, ",user_xattr");
296 if (!test_opt(sb, XATTR_USER) &&
297 (def_mount_opts & EXT2_DEFM_XATTR_USER)) {
298 seq_puts(seq, ",nouser_xattr");
299 }
300 #endif
301
302 #ifdef CONFIG_EXT2_FS_POSIX_ACL
303 if (test_opt(sb, POSIX_ACL))
304 seq_puts(seq, ",acl");
305 if (!test_opt(sb, POSIX_ACL) && (def_mount_opts & EXT2_DEFM_ACL))
306 seq_puts(seq, ",noacl");
307 #endif
308
...
fs/f2fs/super.c
...
441 #ifdef CONFIG_F2FS_FS_XATTR
442 case Opt_user_xattr:
443 set_opt(sbi, XATTR_USER);
444 break;
445 case Opt_nouser_xattr:
446 clear_opt(sbi, XATTR_USER);
447 break;
448 case Opt_inline_xattr:
449 set_opt(sbi, INLINE_XATTR);
450 break;
451 case Opt_noinline_xattr:
452 clear_opt(sbi, INLINE_XATTR);
453 break;
454 case Opt_inline_xattr_size:
455 if (args->from && match_int(args, &arg))
456 return -EINVAL;
457 set_opt(sbi, INLINE_XATTR_SIZE);
458 F2FS_OPTION(sbi).inline_xattr_size = arg;
459 break;
460 #else
461 case Opt_user_xattr:
462 f2fs_msg(sb, KERN_INFO,
463 "user_xattr options not supported");
464 break;
465 case Opt_nouser_xattr:
466 f2fs_msg(sb, KERN_INFO,
467 "nouser_xattr options not supported");
468 break;
469 case Opt_inline_xattr:
470 f2fs_msg(sb, KERN_INFO,
471 "inline_xattr options not supported");
472 break;
473 case Opt_noinline_xattr:
474 f2fs_msg(sb, KERN_INFO,
475 "noinline_xattr options not supported");
476 break;
477 #endif
...
p.s. The fault injection code was taken from f2fs.
and I saw that Chengguang Xu submits a similar patch to f2fs-devel.
https://sourceforge.net/p/linux-f2fs/mailman/message/36412022/
In the future, it could use the common #include <linux/fault-inject.h>
like other modules I guess?
mm/slab_common.c
1555 int should_failslab(struct kmem_cache *s, gfp_t gfpflags)
1556 {
1557 if (__should_failslab(s, gfpflags))
1558 return -ENOMEM;
1559 return 0;
1560 }
1561 ALLOW_ERROR_INJECTION(should_failslab, ERRNO);
mm/failslab.c
17 bool __should_failslab(struct kmem_cache *s, gfp_t gfpflags)
18 {
19 /* No fault-injection for bootstrap cache */
20 if (unlikely(s == kmem_cache))
21 return false;
22
23 if (gfpflags & __GFP_NOFAIL)
24 return false;
25
26 if (failslab.ignore_gfp_reclaim && (gfpflags & __GFP_RECLAIM))
27 return false;
28
29 if (failslab.cache_filter && !(s->flags & SLAB_FAILSLAB))
30 return false;
31
32 return should_fail(&failslab.attr, s->object_size);
33 }
Thanks,
Gao Xiang
>
> thanks,
>
> greg k-h
>
More information about the Linux-erofs
mailing list