Re: [PATCH -next] ext4: Fix remount with 'abort' option isn't effective
From: Lukas Czerner <hidden>
Date: 2021-12-22 09:20:00
Also in:
lkml
On Wed, Dec 22, 2021 at 09:06:22AM +0800, yebin wrote:
On 2021/12/21 22:43, Lukas Czerner wrote:quoted
Hi, nice catch. This is a bug indeed. However I am currently in a process of changing the ctx_set/clear/test_ helpers because currently it generates functions that are unused. While I am at it I can just create a custom ctx_set_mount_flags() helper that would behave as expected so that we won't have to specify "1 < EXT4_MF_FS_ABORTED" which is not really obvious and hence error prone.Actually, I fixed the first version as follows:
Allright, this looks better.
quoted hunk ↗ jump to hunk
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index b72d989b77fb..199920ffc7d3 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c@@ -2049,8 +2049,8 @@ struct ext4_fs_context { unsigned int mask_s_mount_opt; unsigned int vals_s_mount_opt2; unsigned int mask_s_mount_opt2; - unsigned int vals_s_mount_flags; - unsigned int mask_s_mount_flags; + unsigned long vals_s_mount_flags; + unsigned long mask_s_mount_flags; unsigned int opt_flags; /* MOPT flags */ unsigned int spec; u32 s_max_batch_time;@@ -2166,7 +2166,12 @@ static inline bool ctx_test_##name(struct ext4_fs_context *ctx, int flag)\ EXT4_SET_CTX(flags); EXT4_SET_CTX(mount_opt); EXT4_SET_CTX(mount_opt2); -EXT4_SET_CTX(mount_flags); + +static inline void ctx_set_mount_flags(struct ext4_fs_context *ctx, int bit)
Maybe ctx_set_mount_flag since you can't really set more than one this way?
+{
+ set_bit(bit, &ctx->mask_s_mount_flags);
+ set_bit(bit, &ctx->vals_s_mount_flags);
+}
I think 'mask_s_mount_flags' is useless now.So how would we know what flags have changed ? Sure, there is currently no need to clear the flag but that can come in future and once it does we'll only need to create a clear helper, the rest will be ready. I'd rather keep it. -Lukas
quoted
My plan is to send my patch set including this one tomorrow, will that be fine with you ? -Lukas On Tue, Dec 21, 2021 at 08:32:14PM +0800, Ye Bin wrote:quoted
We test remount with 'abort' option as follows: [root@localhost home]# mount /dev/sda test [root@localhost home]# mount | grep test /dev/sda on /home/test type ext4 (rw,relatime) [root@localhost home]# mount -o remount,abort test [root@localhost home]# mount | grep test /dev/sda on /home/test type ext4 (rw,relatime) Obviously, remount 'abort' option isn't effective. After 6e47a3cc68fc commit we process abort option with 'ctx_set_mount_flags': static inline void ctx_set_mount_flags(struct ext4_fs_context *ctx, int flag) { ctx->mask_s_mount_flags |= flag; ctx->vals_s_mount_flags |= flag; } But we test 'abort' option with 'ext4_test_mount_flag': static inline int ext4_test_mount_flag(struct super_block *sb, int bit) { return test_bit(bit, &EXT4_SB(sb)->s_mount_flags); } To solve this issue, pass (1 << EXT4_MF_FS_ABORTED) to 'ctx_set_mount_flags'. Fixes:6e47a3cc68fc("ext4: get rid of super block and sbi from handle_mount_ops()") Signed-off-by: Ye Bin <redacted> --- fs/ext4/super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)diff --git a/fs/ext4/super.c b/fs/ext4/super.c index b72d989b77fb..071b7b3c5678 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c@@ -2236,7 +2236,7 @@ static int ext4_parse_param(struct fs_context *fc, struct fs_parameter *param) param->key); return 0; case Opt_abort: - ctx_set_mount_flags(ctx, EXT4_MF_FS_ABORTED); + ctx_set_mount_flags(ctx, 1 << EXT4_MF_FS_ABORTED); return 0; case Opt_i_version: ctx_set_flags(ctx, SB_I_VERSION);-- 2.31.1.