Patch "ext4: return to starting transaction in ext4_dax_huge_fault()" has been added to the 4.11-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
ext4: return to starting transaction in ext4_dax_huge_fault()
to the 4.11-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-return-to-starting-transaction-in-ext4_dax_huge_fault.patch
and it can be found in the queue-4.11 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
fb26a1cbed8c90025572d48bc9eabe59f7571e88Mon Sep 17 00:00:00 2001
From: Jan Kara <[email protected]>
Date: Fri, 12 May 2017 15:46:54 -0700
Subject: ext4: return to starting transaction in ext4_dax_huge_fault()
From: Jan Kara <[email protected]>
commit fb26a1cbed8c90025572d48bc9eabe59f7571e88 upstream.
DAX will return to locking exceptional entry before mapping blocks for a page fault to fix possible races with concurrent writes. To avoid lock inversion between exceptional entry lock and transaction start, start the transaction already in ext4_dax_huge_fault().
--- fs/ext4/file.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-)
fs/ext4/file.c +17 -4
@@ -257,6 +257,7 @@ static int ext4_dax_huge_fault(struct vm enum page_entry_size pe_size) {int result; +handle_t *handle =NULL ;struct inode *inode =file_inode (vmf->vma->vm_file);struct super_block *sb = inode->i_sb;bool write = vmf->flags &FAULT_FLAG_WRITE ;
@@ -264,12 +265,24 @@ static int ext4_dax_huge_fault(struct vmif (write) {sb_start_pagefault (sb);file_update_time (vmf->vma->vm_file); +down_read (&EXT4_I (inode)->i_mmap_sem); + handle =ext4_journal_start_sb (sb,EXT4_HT_WRITE_PAGE , +EXT4_DATA_TRANS_BLOCKS (sb)); + }else { +down_read (&EXT4_I (inode)->i_mmap_sem); } -down_read (&EXT4_I (inode)->i_mmap_sem); - result =dax_iomap_fault (vmf, pe_size, &ext4_iomap_ops); -up_read (&EXT4_I (inode)->i_mmap_sem); -if (write) +if (!IS_ERR (handle)) + result =dax_iomap_fault (vmf, pe_size, &ext4_iomap_ops); +else + result =VM_FAULT_SIGBUS ; +if (write) { +if (!IS_ERR (handle)) +ext4_journal_stop (handle); +up_read (&EXT4_I (inode)->i_mmap_sem);sb_end_pagefault (sb); + }else { +up_read (&EXT4_I (inode)->i_mmap_sem); + }return result; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.11/fs-block_dev-always-invalidate-cleancache-in-invalidate_bdev.patch queue-4.11/ext4-return-to-starting-transaction-in-ext4_dax_huge_fault.patch queue-4.11/dax-prevent-invalidation-of-mapped-dax-entries.patch queue-4.11/dax-fix-pmd-data-corruption-when-fault-races-with-write.patch queue-4.11/f2fs-make-flush-bios-explicitely-sync.patch queue-4.11/jbd2-fix-dbench4-performance-regression-for-nobarrier-mounts.patch queue-4.11/fs-fix-data-invalidation-in-the-cleancache-during-direct-io.patch queue-4.11/mm-fix-data-corruption-due-to-stale-mmap-reads.patch