summaryrefslogtreecommitdiffstats
path: root/mm/fremap.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2013-08-21 14:44:54 +0200
committerThomas Gleixner <tglx@linutronix.de>2013-08-21 14:44:54 +0200
commitfac778a2b8d6ca953d440baeee72901c2dd5aad9 (patch)
treec43d780b5ff8819f4353b16c99601c5ceeeacad7 /mm/fremap.c
parent07862c1cd6675cde2dd4bd64e64d704ea2185b79 (diff)
parent94fc5d9de5bd757ad46f0d94bc4ebf617c4487f6 (diff)
downloadlinux-fac778a2b8d6ca953d440baeee72901c2dd5aad9.tar.bz2
Merge branch 'linus' into timers/core
Reason: Get upstream changes on which new patches depend on. Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'mm/fremap.c')
-rw-r--r--mm/fremap.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/mm/fremap.c b/mm/fremap.c
index 87da3590c61e..5bff08147768 100644
--- a/mm/fremap.c
+++ b/mm/fremap.c
@@ -57,17 +57,22 @@ static int install_file_pte(struct mm_struct *mm, struct vm_area_struct *vma,
unsigned long addr, unsigned long pgoff, pgprot_t prot)
{
int err = -ENOMEM;
- pte_t *pte;
+ pte_t *pte, ptfile;
spinlock_t *ptl;
pte = get_locked_pte(mm, addr, &ptl);
if (!pte)
goto out;
- if (!pte_none(*pte))
+ ptfile = pgoff_to_pte(pgoff);
+
+ if (!pte_none(*pte)) {
+ if (pte_present(*pte) && pte_soft_dirty(*pte))
+ pte_file_mksoft_dirty(ptfile);
zap_pte(mm, vma, addr, pte);
+ }
- set_pte_at(mm, addr, pte, pgoff_to_pte(pgoff));
+ set_pte_at(mm, addr, pte, ptfile);
/*
* We don't need to run update_mmu_cache() here because the "file pte"
* being installed by install_file_pte() is not a real pte - it's a