diff options
Diffstat (limited to 'mm/filemap.c')
-rw-r--r-- | mm/filemap.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 3d4df44e4221..8ed709a83eb7 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1539,25 +1539,27 @@ int filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
1539 | * waiting for the lock. | 1539 | * waiting for the lock. |
1540 | */ | 1540 | */ |
1541 | do_async_mmap_readahead(vma, ra, file, page, offset); | 1541 | do_async_mmap_readahead(vma, ra, file, page, offset); |
1542 | lock_page(page); | ||
1543 | |||
1544 | /* Did it get truncated? */ | ||
1545 | if (unlikely(page->mapping != mapping)) { | ||
1546 | unlock_page(page); | ||
1547 | put_page(page); | ||
1548 | goto no_cached_page; | ||
1549 | } | ||
1550 | } else { | 1542 | } else { |
1551 | /* No page in the page cache at all */ | 1543 | /* No page in the page cache at all */ |
1552 | do_sync_mmap_readahead(vma, ra, file, offset); | 1544 | do_sync_mmap_readahead(vma, ra, file, offset); |
1553 | count_vm_event(PGMAJFAULT); | 1545 | count_vm_event(PGMAJFAULT); |
1554 | ret = VM_FAULT_MAJOR; | 1546 | ret = VM_FAULT_MAJOR; |
1555 | retry_find: | 1547 | retry_find: |
1556 | page = find_lock_page(mapping, offset); | 1548 | page = find_get_page(mapping, offset); |
1557 | if (!page) | 1549 | if (!page) |
1558 | goto no_cached_page; | 1550 | goto no_cached_page; |
1559 | } | 1551 | } |
1560 | 1552 | ||
1553 | lock_page(page); | ||
1554 | |||
1555 | /* Did it get truncated? */ | ||
1556 | if (unlikely(page->mapping != mapping)) { | ||
1557 | unlock_page(page); | ||
1558 | put_page(page); | ||
1559 | goto retry_find; | ||
1560 | } | ||
1561 | VM_BUG_ON(page->index != offset); | ||
1562 | |||
1561 | /* | 1563 | /* |
1562 | * We have a locked page in the page cache, now we need to check | 1564 | * We have a locked page in the page cache, now we need to check |
1563 | * that it's up-to-date. If not, it is going to be due to an error. | 1565 | * that it's up-to-date. If not, it is going to be due to an error. |