Lock bp->b_bufobj->b_object instead of bp->b_object

This commit is contained in:
Poul-Henning Kamp 2004-10-28 08:38:46 +00:00
parent 24c0f7385b
commit c5995e45eb
2 changed files with 18 additions and 18 deletions

View File

@ -1555,7 +1555,7 @@ vfs_vmio_release(struct buf *bp)
vm_page_t m;
GIANT_REQUIRED;
VM_OBJECT_LOCK(bp->b_object);
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
vm_page_lock_queues();
for (i = 0; i < bp->b_npages; i++) {
m = bp->b_pages[i];
@ -1592,7 +1592,7 @@ vfs_vmio_release(struct buf *bp)
}
}
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(bp->b_object);
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
pmap_qremove(trunc_page((vm_offset_t) bp->b_data), bp->b_npages);
if (bp->b_bufsize) {
@ -2813,7 +2813,7 @@ allocbuf(struct buf *bp, int size)
if (desiredpages < bp->b_npages) {
vm_page_t m;
VM_OBJECT_LOCK(bp->b_object);
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
vm_page_lock_queues();
for (i = desiredpages; i < bp->b_npages; i++) {
/*
@ -2831,7 +2831,7 @@ allocbuf(struct buf *bp, int size)
vm_page_unwire(m, 0);
}
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(bp->b_object);
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
pmap_qremove((vm_offset_t) trunc_page((vm_offset_t)bp->b_data) +
(desiredpages << PAGE_SHIFT), (bp->b_npages - desiredpages));
bp->b_npages = desiredpages;
@ -3452,7 +3452,7 @@ vfs_clean_pages(struct buf *bp)
foff = bp->b_offset;
KASSERT(bp->b_offset != NOOFFSET,
("vfs_clean_pages: no buffer offset"));
VM_OBJECT_LOCK(bp->b_object);
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
vm_page_lock_queues();
for (i = 0; i < bp->b_npages; i++) {
m = bp->b_pages[i];
@ -3466,7 +3466,7 @@ vfs_clean_pages(struct buf *bp)
foff = noff;
}
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(bp->b_object);
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
}
/*
@ -3496,7 +3496,7 @@ vfs_bio_set_validclean(struct buf *bp, int base, int size)
base += (bp->b_offset & PAGE_MASK);
n = PAGE_SIZE - (base & PAGE_MASK);
VM_OBJECT_LOCK(bp->b_object);
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
vm_page_lock_queues();
for (i = base / PAGE_SIZE; size > 0 && i < bp->b_npages; ++i) {
m = bp->b_pages[i];
@ -3510,7 +3510,7 @@ vfs_bio_set_validclean(struct buf *bp, int base, int size)
n = PAGE_SIZE;
}
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(bp->b_object);
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
}
/*
@ -3537,7 +3537,7 @@ vfs_bio_clrbuf(struct buf *bp)
}
bp->b_flags &= ~B_INVAL;
bp->b_ioflags &= ~BIO_ERROR;
VM_OBJECT_LOCK(bp->b_object);
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
if( (bp->b_npages == 1) && (bp->b_bufsize < PAGE_SIZE) &&
(bp->b_offset & PAGE_MASK) == 0) {
if (bp->b_pages[0] == bogus_page)
@ -3579,7 +3579,7 @@ vfs_bio_clrbuf(struct buf *bp)
bp->b_pages[i]->valid |= mask;
}
unlock:
VM_OBJECT_UNLOCK(bp->b_object);
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
bp->b_resid = 0;
}

View File

@ -410,14 +410,14 @@ cluster_rbuild(vp, filesize, lbn, blkno, size, run, fbp)
* take part in the cluster. If it is partially valid
* then we stop.
*/
VM_OBJECT_LOCK(tbp->b_object);
VM_OBJECT_LOCK(tbp->b_bufobj->bo_object);
for (j = 0;j < tbp->b_npages; j++) {
VM_OBJECT_LOCK_ASSERT(tbp->b_pages[j]->object,
MA_OWNED);
if (tbp->b_pages[j]->valid)
break;
}
VM_OBJECT_UNLOCK(tbp->b_object);
VM_OBJECT_UNLOCK(tbp->b_bufobj->bo_object);
if (j != tbp->b_npages) {
bqrelse(tbp);
break;
@ -452,7 +452,7 @@ cluster_rbuild(vp, filesize, lbn, blkno, size, run, fbp)
BUF_KERNPROC(tbp);
TAILQ_INSERT_TAIL(&bp->b_cluster.cluster_head,
tbp, b_cluster.cluster_entry);
VM_OBJECT_LOCK(tbp->b_object);
VM_OBJECT_LOCK(tbp->b_bufobj->bo_object);
vm_page_lock_queues();
for (j = 0; j < tbp->b_npages; j += 1) {
vm_page_t m;
@ -468,7 +468,7 @@ cluster_rbuild(vp, filesize, lbn, blkno, size, run, fbp)
tbp->b_pages[j] = bogus_page;
}
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(tbp->b_object);
VM_OBJECT_UNLOCK(tbp->b_bufobj->bo_object);
/*
* XXX shouldn't this be += size for both, like in
* cluster_wbuild()?
@ -489,7 +489,7 @@ cluster_rbuild(vp, filesize, lbn, blkno, size, run, fbp)
* Fully valid pages in the cluster are already good and do not need
* to be re-read from disk. Replace the page with bogus_page
*/
VM_OBJECT_LOCK(bp->b_object);
VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
for (j = 0; j < bp->b_npages; j++) {
VM_OBJECT_LOCK_ASSERT(bp->b_pages[j]->object, MA_OWNED);
if ((bp->b_pages[j]->valid & VM_PAGE_BITS_ALL) ==
@ -497,7 +497,7 @@ cluster_rbuild(vp, filesize, lbn, blkno, size, run, fbp)
bp->b_pages[j] = bogus_page;
}
}
VM_OBJECT_UNLOCK(bp->b_object);
VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
if (bp->b_bufsize > bp->b_kvasize)
panic("cluster_rbuild: b_bufsize(%ld) > b_kvasize(%d)\n",
bp->b_bufsize, bp->b_kvasize);
@ -927,7 +927,7 @@ cluster_wbuild(vp, size, start_lbn, len)
if (tbp->b_flags & B_VMIO) {
vm_page_t m;
VM_OBJECT_LOCK(tbp->b_object);
VM_OBJECT_LOCK(tbp->b_bufobj->bo_object);
if (i != 0) { /* if not first buffer */
for (j = 0; j < tbp->b_npages; j += 1) {
m = tbp->b_pages[j];
@ -951,7 +951,7 @@ cluster_wbuild(vp, size, start_lbn, len)
}
}
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(tbp->b_object);
VM_OBJECT_UNLOCK(tbp->b_bufobj->bo_object);
}
bp->b_bcount += size;
bp->b_bufsize += size;