diff options
author | attilio <attilio@FreeBSD.org> | 2013-05-22 15:11:00 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2013-05-22 15:11:00 +0000 |
commit | 2df95f4b3ace7ecf0dd47dfd74ea492ca06e4b7e (patch) | |
tree | 4bf1f639d8ef8937478386891804a78c503a8751 /sys/vm/vm_fault.c | |
parent | 99ab7b9d5df4dc2e5a0c020083a7524d302db582 (diff) | |
download | FreeBSD-src-2df95f4b3ace7ecf0dd47dfd74ea492ca06e4b7e.zip FreeBSD-src-2df95f4b3ace7ecf0dd47dfd74ea492ca06e4b7e.tar.gz |
Acquire read lock on the src object for vm_fault_copy_entry().
Sponsored by: EMC / Isilon storage division
Reviewed by: alc
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r-- | sys/vm/vm_fault.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 1313bc8..d7cc651 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -1318,7 +1318,7 @@ vm_fault_copy_entry(vm_map_t dst_map, vm_map_t src_map, * (Because the source is wired down, the page will be in * memory.) */ - VM_OBJECT_WLOCK(src_object); + VM_OBJECT_RLOCK(src_object); object = src_object; pindex = src_pindex + dst_pindex; while ((src_m = vm_page_lookup(object, pindex)) == NULL && @@ -1327,15 +1327,15 @@ vm_fault_copy_entry(vm_map_t dst_map, vm_map_t src_map, /* * Allow fallback to backing objects if we are reading. */ - VM_OBJECT_WLOCK(backing_object); + VM_OBJECT_RLOCK(backing_object); pindex += OFF_TO_IDX(object->backing_object_offset); - VM_OBJECT_WUNLOCK(object); + VM_OBJECT_RUNLOCK(object); object = backing_object; } if (src_m == NULL) panic("vm_fault_copy_wired: page missing"); pmap_copy_page(src_m, dst_m); - VM_OBJECT_WUNLOCK(object); + VM_OBJECT_RUNLOCK(object); dst_m->valid = VM_PAGE_BITS_ALL; dst_m->dirty = VM_PAGE_BITS_ALL; VM_OBJECT_WUNLOCK(dst_object); |