diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/mm/memory.c b/mm/memory.c index 6efe36a998ba..d8aebc52265f 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2996,6 +2996,12 @@ static int do_shared_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
2996 | 2996 | ||
2997 | if (set_page_dirty(fault_page)) | 2997 | if (set_page_dirty(fault_page)) |
2998 | dirtied = 1; | 2998 | dirtied = 1; |
2999 | /* | ||
3000 | * Take a local copy of the address_space - page.mapping may be zeroed | ||
3001 | * by truncate after unlock_page(). The address_space itself remains | ||
3002 | * pinned by vma->vm_file's reference. We rely on unlock_page()'s | ||
3003 | * release semantics to prevent the compiler from undoing this copying. | ||
3004 | */ | ||
2999 | mapping = fault_page->mapping; | 3005 | mapping = fault_page->mapping; |
3000 | unlock_page(fault_page); | 3006 | unlock_page(fault_page); |
3001 | if ((dirtied || vma->vm_ops->page_mkwrite) && mapping) { | 3007 | if ((dirtied || vma->vm_ops->page_mkwrite) && mapping) { |