diff options
author | David S. Miller <davem@davemloft.net> | 2013-08-17 00:37:26 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-08-17 00:37:26 +0200 |
commit | 2ff1cf12c9fe70e75e600404e6a4274b19d293ed (patch) | |
tree | beafddac0a8098e3f07d2ec60e44a2a7d006e605 /mm/fremap.c | |
parent | netlink: Eliminate kmalloc in netlink dump operation. (diff) | |
parent | Merge tag 'clk-fixes-for-linus' of git://git.linaro.org/people/mturquette/linux (diff) | |
download | linux-2ff1cf12c9fe70e75e600404e6a4274b19d293ed.tar.xz linux-2ff1cf12c9fe70e75e600404e6a4274b19d293ed.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'mm/fremap.c')
-rw-r--r-- | mm/fremap.c | 11 |
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 |