FAILED: patch "[PATCH] ext4: avoid race conditions when remounting with options that" failed to apply to 5.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 829b37b8cddb1db75c1b7905505b90e593b15db1 Mon Sep 17 00:00:00 2001
From: Theodore Ts'o <[email protected]>
Date: Wed, 10 Jun 2020 11:16:37 -0400
Subject: [PATCH] ext4: avoid race conditions when remounting with options that
change dax
Trying to change dax mount options when remounting could allow mount options to be enabled for a small amount of time, and then the mount option change would be reverted.
In the case of "mount -o remount,dax", this can cause a race where files would temporarily treated as DAX --- and then not.
fs/ext4/super.c +24 -18
@@ -2104,16 +2104,40 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,switch (token) {case Opt_dax:case Opt_dax_always: +if (is_remount && + (!(sbi->s_mount_opt &EXT4_MOUNT_DAX_ALWAYS ) || + (sbi->s_mount_opt2 &EXT4_MOUNT2_DAX_NEVER ))) { + fail_dax_change_remount: +ext4_msg (sb,KERN_ERR ,"can't change " +"dax mount option while remounting" ); +return -1 ; + } +if (is_remount && + (test_opt (sb,DATA_FLAGS ) == +EXT4_MOUNT_JOURNAL_DATA )) { +ext4_msg (sb,KERN_ERR ,"can't mount with " +"both data=journal and dax" ); +return -1 ; + }ext4_msg (sb,KERN_WARNING ,"DAX enabled. Warning: EXPERIMENTAL, use at your own risk" ); sbi->s_mount_opt |=EXT4_MOUNT_DAX_ALWAYS ; sbi->s_mount_opt2 &= ~EXT4_MOUNT2_DAX_NEVER ;break ;case Opt_dax_never: +if (is_remount && + (!(sbi->s_mount_opt2 &EXT4_MOUNT2_DAX_NEVER ) || + (sbi->s_mount_opt &EXT4_MOUNT_DAX_ALWAYS ))) + goto fail_dax_change_remount; sbi->s_mount_opt2 |=EXT4_MOUNT2_DAX_NEVER ; sbi->s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS ;break ;case Opt_dax_inode: +if (is_remount && + ((sbi->s_mount_opt &EXT4_MOUNT_DAX_ALWAYS ) || + (sbi->s_mount_opt2 &EXT4_MOUNT2_DAX_NEVER ) || + !(sbi->s_mount_opt2 &EXT4_MOUNT2_DAX_INODE ))) + goto fail_dax_change_remount; sbi->s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS ; sbi->s_mount_opt2 &= ~EXT4_MOUNT2_DAX_NEVER ;/* Strictly for printing options */
@@ -5454,12 +5478,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) err = -EINVAL ; goto restore_opts; } -if (test_opt (sb,DAX_ALWAYS )) { -ext4_msg (sb,KERN_ERR ,"can't mount with " -"both data=journal and dax" ); - err = -EINVAL ; - goto restore_opts; - } }else if (test_opt (sb,DATA_FLAGS ) ==EXT4_MOUNT_ORDERED_DATA ) {if (test_opt (sb,JOURNAL_ASYNC_COMMIT )) { ext4_msg(sb, KERN_ERR, "can't mount with "
@@ -5475,18 +5493,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) goto restore_opts; } -if ((sbi->s_mount_opt ^ old_opts.s_mount_opt) &EXT4_MOUNT_DAX_ALWAYS || - (sbi->s_mount_opt2 ^ old_opts.s_mount_opt2) &EXT4_MOUNT2_DAX_NEVER || - (sbi->s_mount_opt2 ^ old_opts.s_mount_opt2) &EXT4_MOUNT2_DAX_INODE ) { -ext4_msg (sb,KERN_WARNING ,"warning: refusing change of " -"dax mount option with busy inodes while remounting" ); - sbi->s_mount_opt &= ~EXT4_MOUNT_DAX_ALWAYS ; - sbi->s_mount_opt |= old_opts.s_mount_opt &EXT4_MOUNT_DAX_ALWAYS ; - sbi->s_mount_opt2 &= ~(EXT4_MOUNT2_DAX_NEVER |EXT4_MOUNT2_DAX_INODE ); - sbi->s_mount_opt2 |= old_opts.s_mount_opt2 & - (EXT4_MOUNT2_DAX_NEVER |EXT4_MOUNT2_DAX_INODE ); - } -if (sbi->s_mount_flags &EXT4_MF_FS_ABORTED )ext4_abort (sb,EXT4_ERR_ESHUTDOWN ,"Abort forced by user" );