diff options
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 26 |
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 | */ |
2194 | int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 2196 | int 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; |
2226 | retry_find: | 2228 | retry_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 | } |
2397 | EXPORT_SYMBOL(filemap_map_pages); | 2399 | EXPORT_SYMBOL(filemap_map_pages); |
2398 | 2400 | ||
2399 | int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | 2401 | int 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); |