From: Matthew Wilcox <willy@xxxxxxxxxxxxxxx> Call into DAX to provide support for PUD pages, just like the PMD cases. Signed-off-by: Matthew Wilcox <willy@xxxxxxxxxxxxxxx> --- fs/ext4/file.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 60683ab..b0cba51 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -262,6 +262,42 @@ static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, return result; } +static int ext4_dax_pud_fault(struct vm_area_struct *vma, unsigned long addr, + pud_t *pud, unsigned int flags) +{ + int result; + handle_t *handle = NULL; + struct inode *inode = file_inode(vma->vm_file); + struct super_block *sb = inode->i_sb; + bool write = flags & FAULT_FLAG_WRITE; + + if (write) { + sb_start_pagefault(sb); + file_update_time(vma->vm_file); + down_read(&EXT4_I(inode)->i_mmap_sem); + handle = ext4_journal_start_sb(sb, EXT4_HT_WRITE_PAGE, + ext4_chunk_trans_blocks(inode, + PMD_SIZE / PAGE_SIZE)); + } else + down_read(&EXT4_I(inode)->i_mmap_sem); + + if (IS_ERR(handle)) + result = VM_FAULT_SIGBUS; + else + result = __dax_pud_fault(vma, addr, pud, flags, + ext4_dax_mmap_get_block, NULL); + + 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; +} + static int ext4_dax_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) { int err; @@ -309,6 +345,7 @@ static int ext4_dax_pfn_mkwrite(struct vm_area_struct *vma, static const struct vm_operations_struct ext4_dax_vm_ops = { .fault = ext4_dax_fault, .pmd_fault = ext4_dax_pmd_fault, + .pud_fault = ext4_dax_pud_fault, .page_mkwrite = ext4_dax_mkwrite, .pfn_mkwrite = ext4_dax_pfn_mkwrite, }; -- 2.6.2 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html