Merge branch 'akpm' (patches from Andrew)
Merge updates from Andrew Morton: - various misc bits - DAX updates - OCFS2 - most of MM * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (119 commits) mm,fork: introduce MADV_WIPEONFORK x86,mpx: make mpx depend on x86-64 to free up VMA flag mm: add /proc/pid/smaps_rollup mm: hugetlb: clear target sub-page last when clearing huge page mm: oom: let oom_reap_task and exit_mmap run concurrently swap: choose swap device according to numa node mm: replace TIF_MEMDIE checks by tsk_is_oom_victim mm, oom: do not rely on TIF_MEMDIE for memory reserves access z3fold: use per-cpu unbuddied lists mm, swap: don't use VMA based swap readahead if HDD is used as swap mm, swap: add sysfs interface for VMA based swap readahead mm, swap: VMA based swap readahead mm, swap: fix swap readahead marking mm, swap: add swap readahead hit statistics mm/vmalloc.c: don't reinvent the wheel but use existing llist API mm/vmstat.c: fix wrong comment selftests/memfd: add memfd_create hugetlbfs selftest mm/shmem: add hugetlbfs support to memfd_create() mm, devm_memremap_pages: use multi-order radix for ZONE_DEVICE lookups mm/vmalloc.c: halve the number of comparisons performed in pcpu_get_vm_areas() ...
This commit is contained in:
@ -324,41 +324,11 @@ static int ext4_dax_fault(struct vm_fault *vmf)
|
||||
return ext4_dax_huge_fault(vmf, PE_SIZE_PTE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle write fault for VM_MIXEDMAP mappings. Similarly to ext4_dax_fault()
|
||||
* handler we check for races agaist truncate. Note that since we cycle through
|
||||
* i_mmap_sem, we are sure that also any hole punching that began before we
|
||||
* were called is finished by now and so if it included part of the file we
|
||||
* are working on, our pte will get unmapped and the check for pte_same() in
|
||||
* wp_pfn_shared() fails. Thus fault gets retried and things work out as
|
||||
* desired.
|
||||
*/
|
||||
static int ext4_dax_pfn_mkwrite(struct vm_fault *vmf)
|
||||
{
|
||||
struct inode *inode = file_inode(vmf->vma->vm_file);
|
||||
struct super_block *sb = inode->i_sb;
|
||||
loff_t size;
|
||||
int ret;
|
||||
|
||||
sb_start_pagefault(sb);
|
||||
file_update_time(vmf->vma->vm_file);
|
||||
down_read(&EXT4_I(inode)->i_mmap_sem);
|
||||
size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
if (vmf->pgoff >= size)
|
||||
ret = VM_FAULT_SIGBUS;
|
||||
else
|
||||
ret = dax_pfn_mkwrite(vmf);
|
||||
up_read(&EXT4_I(inode)->i_mmap_sem);
|
||||
sb_end_pagefault(sb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct vm_operations_struct ext4_dax_vm_ops = {
|
||||
.fault = ext4_dax_fault,
|
||||
.huge_fault = ext4_dax_huge_fault,
|
||||
.page_mkwrite = ext4_dax_fault,
|
||||
.pfn_mkwrite = ext4_dax_pfn_mkwrite,
|
||||
.pfn_mkwrite = ext4_dax_fault,
|
||||
};
|
||||
#else
|
||||
#define ext4_dax_vm_ops ext4_file_vm_ops
|
||||
@ -507,12 +477,11 @@ static int ext4_find_unwritten_pgoff(struct inode *inode,
|
||||
|
||||
pagevec_init(&pvec, 0);
|
||||
do {
|
||||
int i, num;
|
||||
int i;
|
||||
unsigned long nr_pages;
|
||||
|
||||
num = min_t(pgoff_t, end - index, PAGEVEC_SIZE - 1) + 1;
|
||||
nr_pages = pagevec_lookup(&pvec, inode->i_mapping, index,
|
||||
(pgoff_t)num);
|
||||
nr_pages = pagevec_lookup_range(&pvec, inode->i_mapping,
|
||||
&index, end);
|
||||
if (nr_pages == 0)
|
||||
break;
|
||||
|
||||
@ -531,9 +500,6 @@ static int ext4_find_unwritten_pgoff(struct inode *inode,
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (page->index > end)
|
||||
goto out;
|
||||
|
||||
lock_page(page);
|
||||
|
||||
if (unlikely(page->mapping != inode->i_mapping)) {
|
||||
@ -576,14 +542,10 @@ next:
|
||||
unlock_page(page);
|
||||
}
|
||||
|
||||
/* The no. of pages is less than our desired, we are done. */
|
||||
if (nr_pages < num)
|
||||
break;
|
||||
|
||||
index = pvec.pages[i - 1]->index + 1;
|
||||
pagevec_release(&pvec);
|
||||
} while (index <= end);
|
||||
|
||||
/* There are no pages upto endoff - that would be a hole in there. */
|
||||
if (whence == SEEK_HOLE && lastoff < endoff) {
|
||||
found = 1;
|
||||
*offset = lastoff;
|
||||
|
Reference in New Issue
Block a user