Patch "ext4: prevent data corruption with journaling + DAX" has been added to the 4.14-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ext4: prevent data corruption with journaling + DAX
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
ext4-prevent-data-corruption-with-journaling-dax.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
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: ext4: prevent data corruption with journaling + DAX
From: Ross Zwisler <[email protected]>
commit e9072d859df3e0f2c3ba450f0d1739595c2d5d13 upstream.
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 | 5 ----- fs/ext4/ioctl.c | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 8 deletions(-)
fs/ext4/inode.c +0 -5
@@ -5967,11 +5967,6 @@ int ext4_change_inode_journal_flag(strucext4_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
@@ -291,10 +291,20 @@ flags_err: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);
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/ext4-prevent-data-corruption-with-journaling-dax.patch queue-4.14/ext4-prevent-data-corruption-with-inline-data-dax.patch