summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_bio.c
diff options
context:
space:
mode:
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