diff options
Diffstat (limited to 'mm/memory.c')
-rw-r--r-- | mm/memory.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/mm/memory.c b/mm/memory.c index 482f089765ff..57361708d1a5 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -2650,6 +2650,9 @@ reuse: | |||
2650 | if (!page_mkwrite) { | 2650 | if (!page_mkwrite) { |
2651 | wait_on_page_locked(dirty_page); | 2651 | wait_on_page_locked(dirty_page); |
2652 | set_page_dirty_balance(dirty_page, page_mkwrite); | 2652 | set_page_dirty_balance(dirty_page, page_mkwrite); |
2653 | /* file_update_time outside page_lock */ | ||
2654 | if (vma->vm_file) | ||
2655 | file_update_time(vma->vm_file); | ||
2653 | } | 2656 | } |
2654 | put_page(dirty_page); | 2657 | put_page(dirty_page); |
2655 | if (page_mkwrite) { | 2658 | if (page_mkwrite) { |
@@ -2667,10 +2670,6 @@ reuse: | |||
2667 | } | 2670 | } |
2668 | } | 2671 | } |
2669 | 2672 | ||
2670 | /* file_update_time outside page_lock */ | ||
2671 | if (vma->vm_file) | ||
2672 | file_update_time(vma->vm_file); | ||
2673 | |||
2674 | return ret; | 2673 | return ret; |
2675 | } | 2674 | } |
2676 | 2675 | ||
@@ -3339,12 +3338,13 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
3339 | 3338 | ||
3340 | if (dirty_page) { | 3339 | if (dirty_page) { |
3341 | struct address_space *mapping = page->mapping; | 3340 | struct address_space *mapping = page->mapping; |
3341 | int dirtied = 0; | ||
3342 | 3342 | ||
3343 | if (set_page_dirty(dirty_page)) | 3343 | if (set_page_dirty(dirty_page)) |
3344 | page_mkwrite = 1; | 3344 | dirtied = 1; |
3345 | unlock_page(dirty_page); | 3345 | unlock_page(dirty_page); |
3346 | put_page(dirty_page); | 3346 | put_page(dirty_page); |
3347 | if (page_mkwrite && mapping) { | 3347 | if ((dirtied || page_mkwrite) && mapping) { |
3348 | /* | 3348 | /* |
3349 | * Some device drivers do not set page.mapping but still | 3349 | * Some device drivers do not set page.mapping but still |
3350 | * dirty their pages | 3350 | * dirty their pages |
@@ -3353,7 +3353,7 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma, | |||
3353 | } | 3353 | } |
3354 | 3354 | ||
3355 | /* file_update_time outside page_lock */ | 3355 | /* file_update_time outside page_lock */ |
3356 | if (vma->vm_file) | 3356 | if (vma->vm_file && !page_mkwrite) |
3357 | file_update_time(vma->vm_file); | 3357 | file_update_time(vma->vm_file); |
3358 | } else { | 3358 | } else { |
3359 | unlock_page(vmf.page); | 3359 | unlock_page(vmf.page); |