FAILED: patch "[PATCH] ext4: prevent data corruption with journaling + DAX" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.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 ------------------
Quoted 1 line
From
e9072d859df3e0f2c3ba450f0d1739595c2d5d13Mon Sep 17 00:00:00 2001
From: Ross Zwisler <[email protected]>
Date: Thu, 12 Oct 2017 11:54:08 -0400
Subject: [PATCH] ext4: prevent data corruption with journaling + DAX
The current code has the potential for data corruption when changing an inode's journaling mode, as that can result in a subsequent unsafe change in S_DAX.
I've captured an instance of this data corruption in the following fstest:
https://patchwork.kernel.org/patch/9948377/
Prevent this data corruption from happening by disallowing changes to the journaling mode if the '-o dax' mount option was used. This means that for a given filesystem we could have a mix of inodes using either DAX or data journaling, but whatever state the inodes are in will be held for the duration of the mount.
fs/ext4/inode.c +0 -5
@@ -6004,11 +6004,6 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)ext4_clear_inode_flag (inode,EXT4_INODE_JOURNAL_DATA ); }ext4_set_aops (inode); -/* -* Update inode->i_flags after EXT4_INODE_JOURNAL_DATA was updated. -* E.g. S_DAX may get cleared / set. -*/ -ext4_set_inode_flags (inode);jbd2_journal_unlock_updates (journal);percpu_up_write (&sbi->s_journal_flag_rwsem);
fs/ext4/ioctl.c +13 -3
@@ -290,10 +290,20 @@ static int ext4_ioctl_setflags(struct inode *inode,if (err) goto flags_out; -if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL )) +if ((jflag ^ oldflags) & (EXT4_JOURNAL_DATA_FL )) { +/* +* Changes to the journaling mode can cause unsafe changes to +* S_DAX if we are using the DAX mount option. +*/ +if (test_opt (inode->i_sb,DAX )) { + err = -EBUSY ; + goto flags_out; + } + err =ext4_change_inode_journal_flag (inode, jflag); -if (err) - goto flags_out; +if (err) + goto flags_out; + }if (migrate) {if (flags &EXT4_EXTENTS_FL ) err =ext4_ext_migrate (inode);