summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_bio.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-06-11 16:37:33 +0000
committeralc <alc@FreeBSD.org>2003-06-11 16:37:33 +0000
commitdf7799dd7709814ba2d70700ad2ac7570c02fbf2 (patch)
treea6c4d8826ddf41f87d078fa8325f1d76ab6e1a59 /sys/kern/vfs_bio.c
parentae671c580c7b85228a70fb7e5b30913d581990f9 (diff)
downloadFreeBSD-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.c8
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;
}
OpenPOWER on IntegriCloud