aboutsummaryrefslogtreecommitdiffstats
path: root/mm/filemap.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/filemap.c')
-rw-r--r--mm/filemap.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/mm/filemap.c b/mm/filemap.c
index 416d563468a3..1944c631e3e6 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1008,9 +1008,12 @@ void page_endio(struct page *page, bool is_write, int err)
1008 unlock_page(page); 1008 unlock_page(page);
1009 } else { 1009 } else {
1010 if (err) { 1010 if (err) {
1011 struct address_space *mapping;
1012
1011 SetPageError(page); 1013 SetPageError(page);
1012 if (page->mapping) 1014 mapping = page_mapping(page);
1013 mapping_set_error(page->mapping, err); 1015 if (mapping)
1016 mapping_set_error(mapping, err);
1014 } 1017 }
1015 end_page_writeback(page); 1018 end_page_writeback(page);
1016 } 1019 }
@@ -2169,7 +2172,6 @@ static void do_async_mmap_readahead(struct vm_area_struct *vma,
2169 2172
2170/** 2173/**
2171 * filemap_fault - read in file data for page fault handling 2174 * filemap_fault - read in file data for page fault handling
2172 * @vma: vma in which the fault was taken
2173 * @vmf: struct vm_fault containing details of the fault 2175 * @vmf: struct vm_fault containing details of the fault
2174 * 2176 *
2175 * filemap_fault() is invoked via the vma operations vector for a 2177 * filemap_fault() is invoked via the vma operations vector for a
@@ -2191,10 +2193,10 @@ static void do_async_mmap_readahead(struct vm_area_struct *vma,
2191 * 2193 *
2192 * We never return with VM_FAULT_RETRY and a bit from VM_FAULT_ERROR set. 2194 * We never return with VM_FAULT_RETRY and a bit from VM_FAULT_ERROR set.
2193 */ 2195 */
2194int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 2196int filemap_fault(struct vm_fault *vmf)
2195{ 2197{
2196 int error; 2198 int error;
2197 struct file *file = vma->vm_file; 2199 struct file *file = vmf->vma->vm_file;
2198 struct address_space *mapping = file->f_mapping; 2200 struct address_space *mapping = file->f_mapping;
2199 struct file_ra_state *ra = &file->f_ra; 2201 struct file_ra_state *ra = &file->f_ra;
2200 struct inode *inode = mapping->host; 2202 struct inode *inode = mapping->host;
@@ -2216,12 +2218,12 @@ int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
2216 * We found the page, so try async readahead before 2218 * We found the page, so try async readahead before
2217 * waiting for the lock. 2219 * waiting for the lock.
2218 */ 2220 */
2219 do_async_mmap_readahead(vma, ra, file, page, offset); 2221 do_async_mmap_readahead(vmf->vma, ra, file, page, offset);
2220 } else if (!page) { 2222 } else if (!page) {
2221 /* No page in the page cache at all */ 2223 /* No page in the page cache at all */
2222 do_sync_mmap_readahead(vma, ra, file, offset); 2224 do_sync_mmap_readahead(vmf->vma, ra, file, offset);
2223 count_vm_event(PGMAJFAULT); 2225 count_vm_event(PGMAJFAULT);
2224 mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT); 2226 mem_cgroup_count_vm_event(vmf->vma->vm_mm, PGMAJFAULT);
2225 ret = VM_FAULT_MAJOR; 2227 ret = VM_FAULT_MAJOR;
2226retry_find: 2228retry_find:
2227 page = find_get_page(mapping, offset); 2229 page = find_get_page(mapping, offset);
@@ -2229,7 +2231,7 @@ retry_find:
2229 goto no_cached_page; 2231 goto no_cached_page;
2230 } 2232 }
2231 2233
2232 if (!lock_page_or_retry(page, vma->vm_mm, vmf->flags)) { 2234 if (!lock_page_or_retry(page, vmf->vma->vm_mm, vmf->flags)) {
2233 put_page(page); 2235 put_page(page);
2234 return ret | VM_FAULT_RETRY; 2236 return ret | VM_FAULT_RETRY;
2235 } 2237 }
@@ -2396,14 +2398,14 @@ next:
2396} 2398}
2397EXPORT_SYMBOL(filemap_map_pages); 2399EXPORT_SYMBOL(filemap_map_pages);
2398 2400
2399int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) 2401int filemap_page_mkwrite(struct vm_fault *vmf)
2400{ 2402{
2401 struct page *page = vmf->page; 2403 struct page *page = vmf->page;
2402 struct inode *inode = file_inode(vma->vm_file); 2404 struct inode *inode = file_inode(vmf->vma->vm_file);
2403 int ret = VM_FAULT_LOCKED; 2405 int ret = VM_FAULT_LOCKED;
2404 2406
2405 sb_start_pagefault(inode->i_sb); 2407 sb_start_pagefault(inode->i_sb);
2406 file_update_time(vma->vm_file); 2408 file_update_time(vmf->vma->vm_file);
2407 lock_page(page); 2409 lock_page(page);
2408 if (page->mapping != inode->i_mapping) { 2410 if (page->mapping != inode->i_mapping) {
2409 unlock_page(page); 2411 unlock_page(page);