summaryrefslogtreecommitdiff
path: root/kernel/ptrace.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@athlon.transmeta.com>2002-02-04 18:03:54 -0800
committerLinus Torvalds <torvalds@athlon.transmeta.com>2002-02-04 18:03:54 -0800
commit8565fe850b04acbfdc4c24cdcafeed359bb0f2b3 (patch)
tree84d828d3cf49c6ce3faabdc715a08ca4f43c4ac9 /kernel/ptrace.c
parentb56566c61ebe66fc5c9aa33385ba5b13bf6a8957 (diff)
v2.4.2.3 -> v2.4.2.4
- Petr Vandrovec, Al Viro: dentry revalidation fixes - Stephen Tweedie / Manfred Spraul: kswapd and ptrace race - Neil Brown: nfsd/rpc/raid cleanups and fixes
Diffstat (limited to 'kernel/ptrace.c')
-rw-r--r--kernel/ptrace.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index 410f9de937bc..f6912dd7953e 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -28,6 +28,7 @@ static int access_one_page(struct mm_struct * mm, struct vm_area_struct * vma, u
struct page *page;
repeat:
+ spin_lock(&mm->page_table_lock);
pgdir = pgd_offset(vma->vm_mm, addr);
if (pgd_none(*pgdir))
goto fault_in_page;
@@ -47,9 +48,13 @@ repeat:
/* ZERO_PAGE is special: reads from it are ok even though it's marked reserved */
if (page != ZERO_PAGE(addr) || write) {
- if ((!VALID_PAGE(page)) || PageReserved(page))
+ if ((!VALID_PAGE(page)) || PageReserved(page)) {
+ spin_unlock(&mm->page_table_lock);
return 0;
+ }
}
+ get_page(page);
+ spin_unlock(&mm->page_table_lock);
flush_cache_page(vma, addr);
if (write) {
@@ -64,19 +69,23 @@ repeat:
flush_page_to_ram(page);
kunmap(page);
}
+ put_page(page);
return len;
fault_in_page:
+ spin_unlock(&mm->page_table_lock);
/* -1: out of memory. 0 - unmapped page */
if (handle_mm_fault(mm, vma, addr, write) > 0)
goto repeat;
return 0;
bad_pgd:
+ spin_unlock(&mm->page_table_lock);
pgd_ERROR(*pgdir);
return 0;
bad_pmd:
+ spin_unlock(&mm->page_table_lock);
pmd_ERROR(*pgmiddle);
return 0;
}