patch-2.4.3 linux/kernel/ptrace.c
Next file: linux/kernel/sched.c
Previous file: linux/kernel/pm.c
Back to the patch index
Back to the overall index
- Lines: 63
- Date:
Mon Mar 19 12:35:08 2001
- Orig file:
v2.4.2/linux/kernel/ptrace.c
- Orig date:
Wed Nov 8 19:01:34 2000
diff -u --recursive --new-file v2.4.2/linux/kernel/ptrace.c linux/kernel/ptrace.c
@@ -28,6 +28,7 @@
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 @@
/* 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 @@
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;
}
@@ -131,13 +140,13 @@
if (!mm)
return 0;
- down(&mm->mmap_sem);
+ down_read(&mm->mmap_sem);
vma = find_extend_vma(mm, addr);
copied = 0;
if (vma)
copied = access_mm(mm, vma, addr, buf, len, write);
- up(&mm->mmap_sem);
+ up_read(&mm->mmap_sem);
mmput(mm);
return copied;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)