summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-11-15 09:18:27 +0000
committerphk <phk@FreeBSD.org>2004-11-15 09:18:27 +0000
commitd8b3df3cb90ffaa3381db166cd1e1f43fa25aa69 (patch)
tree271ca682bb616e6a1ee006756d44b1114980e7f9 /sys/vm
parent6809658d1c9ca4eeca1cc691f6104b6ac431e296 (diff)
downloadFreeBSD-src-d8b3df3cb90ffaa3381db166cd1e1f43fa25aa69.zip
FreeBSD-src-d8b3df3cb90ffaa3381db166cd1e1f43fa25aa69.tar.gz
Make VOP_BMAP return a struct bufobj for the underlying storage device
instead of a vnode for it. The vnode_pager does not and should not have any interest in what the filesystem uses for backend. (vfs_cluster doesn't use the backing store argument.)
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vnode_pager.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index 32b06f1..0856f96 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -433,7 +433,8 @@ vnode_pager_input_smlfs(object, m)
vm_page_t m;
{
int i;
- struct vnode *dp, *vp;
+ struct vnode *vp;
+ struct bufobj *bo;
struct buf *bp;
struct sf_buf *sf;
int fileaddr;
@@ -448,7 +449,7 @@ vnode_pager_input_smlfs(object, m)
bsize = vp->v_mount->mnt_stat.f_iosize;
- VOP_BMAP(vp, 0, &dp, 0, NULL, NULL);
+ VOP_BMAP(vp, 0, &bo, 0, NULL, NULL);
sf = sf_buf_alloc(m, 0);
@@ -476,7 +477,7 @@ vnode_pager_input_smlfs(object, m)
bp->b_wcred = crhold(curthread->td_ucred);
bp->b_data = (caddr_t)sf_buf_kva(sf) + i * bsize;
bp->b_blkno = fileaddr;
- pbgetvp(dp, bp);
+ pbgetbo(bo, bp);
bp->b_bcount = bsize;
bp->b_bufsize = bsize;
bp->b_runningbufspace = bp->b_bufsize;
@@ -496,7 +497,7 @@ vnode_pager_input_smlfs(object, m)
/*
* free the buffer header back to the swap buffer pool
*/
- pbrelvp(bp);
+ pbrelbo(bp);
relpbuf(bp, &vnode_pbuf_freecnt);
if (error)
break;
@@ -645,7 +646,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
vm_offset_t kva;
off_t foff, tfoff, nextoff;
int i, j, size, bsize, first, firstaddr;
- struct vnode *dp;
+ struct bufobj *bo;
int runpg;
int runend;
struct buf *bp;
@@ -656,6 +657,8 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
object = vp->v_object;
count = bytecount / PAGE_SIZE;
+ KASSERT(vp->v_type != VCHR && vp->v_type != VBLK,
+ ("vnode_pager_generic_getpages does not support devices"));
if (vp->v_mount == NULL)
return VM_PAGER_BAD;
@@ -672,7 +675,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
/*
* if we can't bmap, use old VOP code
*/
- if (VOP_BMAP(vp, 0, &dp, 0, NULL, NULL)) {
+ if (VOP_BMAP(vp, 0, &bo, 0, NULL, NULL)) {
VM_OBJECT_LOCK(object);
vm_page_lock_queues();
for (i = 0; i < count; i++)
@@ -803,8 +806,8 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
/*
* round up physical size for real devices.
*/
- if (dp->v_type == VBLK || dp->v_type == VCHR) {
- int secmask = dp->v_bufobj.bo_bsize - 1;
+ if (1) {
+ int secmask = bo->bo_bsize - 1;
KASSERT(secmask < PAGE_SIZE && secmask > 0,
("vnode_pager_generic_getpages: sector size %d too large",
secmask + 1));
@@ -827,7 +830,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
bp->b_rcred = crhold(curthread->td_ucred);
bp->b_wcred = crhold(curthread->td_ucred);
bp->b_blkno = firstaddr;
- pbgetvp(dp, bp);
+ pbgetbo(bo, bp);
bp->b_bcount = size;
bp->b_bufsize = size;
bp->b_runningbufspace = bp->b_bufsize;
@@ -854,7 +857,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
/*
* free the buffer header back to the swap buffer pool
*/
- pbrelvp(bp);
+ pbrelbo(bp);
relpbuf(bp, &vnode_pbuf_freecnt);
VM_OBJECT_LOCK(object);
OpenPOWER on IntegriCloud