FAILED: patch "[PATCH] ext4: return to starting transaction in ext4_dax_huge_fault()" failed to apply to 4.10-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.10-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
fb26a1cbed8c90025572d48bc9eabe59f7571e88Mon Sep 17 00:00:00 2001
From: Jan Kara <[email protected]>
Date: Fri, 12 May 2017 15:46:54 -0700
Subject: [PATCH] ext4: return to starting transaction in ext4_dax_huge_fault()
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 +17 -4
@@ -257,6 +257,7 @@ static int ext4_dax_huge_fault(struct vm_fault *vmf, 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 vm_fault *vmf,if (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; }