diff options
author | alc <alc@FreeBSD.org> | 2003-06-11 16:37:33 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-06-11 16:37:33 +0000 |
commit | df7799dd7709814ba2d70700ad2ac7570c02fbf2 (patch) | |
tree | a6c4d8826ddf41f87d078fa8325f1d76ab6e1a59 /sys/kern/vfs_bio.c | |
parent | ae671c580c7b85228a70fb7e5b30913d581990f9 (diff) | |
download | FreeBSD-src-df7799dd7709814ba2d70700ad2ac7570c02fbf2.zip FreeBSD-src-df7799dd7709814ba2d70700ad2ac7570c02fbf2.tar.gz |
Lock the vm object when removing a page.
Diffstat (limited to 'sys/kern/vfs_bio.c')
-rw-r--r-- | sys/kern/vfs_bio.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index bcc3897..ffcbc97 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -1548,6 +1548,8 @@ vfs_vmio_release(bp) vm_page_t m; GIANT_REQUIRED; + if (bp->b_object != NULL) + VM_OBJECT_LOCK(bp->b_object); vm_page_lock_queues(); for (i = 0; i < bp->b_npages; i++) { m = bp->b_pages[i]; @@ -1585,6 +1587,8 @@ vfs_vmio_release(bp) } } vm_page_unlock_queues(); + if (bp->b_object != NULL) + VM_OBJECT_UNLOCK(bp->b_object); pmap_qremove(trunc_page((vm_offset_t) bp->b_data), bp->b_npages); if (bp->b_bufsize) { @@ -3588,6 +3592,8 @@ vm_hold_free_pages(struct buf * bp, vm_offset_t from, vm_offset_t to) to = round_page(to); newnpages = index = (from - trunc_page((vm_offset_t)bp->b_data)) >> PAGE_SHIFT; + if (bp->b_object != NULL) + VM_OBJECT_LOCK(bp->b_object); for (pg = from; pg < to; pg += PAGE_SIZE, index++) { p = bp->b_pages[index]; if (p && (index < bp->b_npages)) { @@ -3606,6 +3612,8 @@ vm_hold_free_pages(struct buf * bp, vm_offset_t from, vm_offset_t to) vm_page_unlock_queues(); } } + if (bp->b_object != NULL) + VM_OBJECT_UNLOCK(bp->b_object); bp->b_npages = newnpages; } |