diff options
author | Adam Litke <agl@us.ibm.com> | 2007-12-10 18:49:28 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-12-10 22:43:55 -0500 |
commit | 72fad7139b6829f71d7f41f39eb30da5760d90a8 (patch) | |
tree | 4f33b824f37923b8f65f2a0542a2e9dcb110c22e | |
parent | 8805f2387086a7e6a9647d0713fc075694130d6c (diff) |
hugetlb: handle write-protection faults in follow_hugetlb_page
The follow_hugetlb_page() fix I posted (merged as git commit
5b23dbe8173c212d6a326e35347b038705603d39) missed one case. If the pte is
present, but not writable and write access is requested by the caller to
get_user_pages(), the code will do the wrong thing. Rather than calling
hugetlb_fault to make the pte writable, it notes the presence of the pte
and continues.
This simple one-liner makes sure we also fault on the pte for this case.
Please apply.
Signed-off-by: Adam Litke <agl@us.ibm.com>
Acked-by: Dave Kleikamp <shaggy@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | mm/hugetlb.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 6121b57bbe96..6f978218c2c8 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -907,7 +907,7 @@ int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma, | |||
907 | */ | 907 | */ |
908 | pte = huge_pte_offset(mm, vaddr & HPAGE_MASK); | 908 | pte = huge_pte_offset(mm, vaddr & HPAGE_MASK); |
909 | 909 | ||
910 | if (!pte || pte_none(*pte)) { | 910 | if (!pte || pte_none(*pte) || (write && !pte_write(*pte))) { |
911 | int ret; | 911 | int ret; |
912 | 912 | ||
913 | spin_unlock(&mm->page_table_lock); | 913 | spin_unlock(&mm->page_table_lock); |