diff options
Diffstat (limited to 'fs/ext4/file.c')
| -rw-r--r-- | fs/ext4/file.c | 26 | 
1 files changed, 20 insertions, 6 deletions
| diff --git a/fs/ext4/file.c b/fs/ext4/file.c index b1da660ac3bc..08a1d1a33a90 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -26,6 +26,7 @@  #include <linux/quotaops.h>  #include <linux/pagevec.h>  #include <linux/uio.h> +#include <linux/mman.h>  #include "ext4.h"  #include "ext4_jbd2.h"  #include "xattr.h" @@ -295,6 +296,7 @@ static int ext4_dax_huge_fault(struct vm_fault *vmf,  	 */  	bool write = (vmf->flags & FAULT_FLAG_WRITE) &&  		(vmf->vma->vm_flags & VM_SHARED); +	pfn_t pfn;  	if (write) {  		sb_start_pagefault(sb); @@ -302,16 +304,20 @@ static int ext4_dax_huge_fault(struct vm_fault *vmf,  		down_read(&EXT4_I(inode)->i_mmap_sem);  		handle = ext4_journal_start_sb(sb, EXT4_HT_WRITE_PAGE,  					       EXT4_DATA_TRANS_BLOCKS(sb)); +		if (IS_ERR(handle)) { +			up_read(&EXT4_I(inode)->i_mmap_sem); +			sb_end_pagefault(sb); +			return VM_FAULT_SIGBUS; +		}  	} else {  		down_read(&EXT4_I(inode)->i_mmap_sem);  	} -	if (!IS_ERR(handle)) -		result = dax_iomap_fault(vmf, pe_size, &ext4_iomap_ops); -	else -		result = VM_FAULT_SIGBUS; +	result = dax_iomap_fault(vmf, pe_size, &pfn, &ext4_iomap_ops);  	if (write) { -		if (!IS_ERR(handle)) -			ext4_journal_stop(handle); +		ext4_journal_stop(handle); +		/* Handling synchronous page fault? */ +		if (result & VM_FAULT_NEEDDSYNC) +			result = dax_finish_sync_fault(vmf, pe_size, pfn);  		up_read(&EXT4_I(inode)->i_mmap_sem);  		sb_end_pagefault(sb);  	} else { @@ -349,6 +355,13 @@ static int ext4_file_mmap(struct file *file, struct vm_area_struct *vma)  	if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))  		return -EIO; +	/* +	 * We don't support synchronous mappings for non-DAX files. At least +	 * until someone comes with a sensible use case. +	 */ +	if (!IS_DAX(file_inode(file)) && (vma->vm_flags & VM_SYNC)) +		return -EOPNOTSUPP; +  	file_accessed(file);  	if (IS_DAX(file_inode(file))) {  		vma->vm_ops = &ext4_dax_vm_ops; @@ -718,6 +731,7 @@ const struct file_operations ext4_file_operations = {  	.compat_ioctl	= ext4_compat_ioctl,  #endif  	.mmap		= ext4_file_mmap, +	.mmap_supported_flags = MAP_SYNC,  	.open		= ext4_file_open,  	.release	= ext4_release_file,  	.fsync		= ext4_sync_file, | 
