summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_bio.c
diff options
context:
space:
mode:
authorbp <bp@FreeBSD.org>2000-09-12 09:49:08 +0000
committerbp <bp@FreeBSD.org>2000-09-12 09:49:08 +0000
commita7bc78c86d1b25efbea8d9ad3e7354ef3a302e90 (patch)
treeae6a2a75d2b0d94e115a73fd536dca86dba92ac4 /sys/kern/vfs_bio.c
parent7893328799a796677510cba9c7bbb8e52d8ce56c (diff)
downloadFreeBSD-src-a7bc78c86d1b25efbea8d9ad3e7354ef3a302e90.zip
FreeBSD-src-a7bc78c86d1b25efbea8d9ad3e7354ef3a302e90.tar.gz
Add three new VOPs: VOP_CREATEVOBJECT, VOP_DESTROYVOBJECT and VOP_GETVOBJECT.
They will be used by nullfs and other stacked filesystems to support full cache coherency. Reviewed in general by: mckusick, dillon
Diffstat (limited to 'sys/kern/vfs_bio.c')
-rw-r--r--sys/kern/vfs_bio.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 34cff17..11e9183 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -1027,7 +1027,7 @@ brelse(struct buf * bp)
vm_page_flag_clear(m, PG_ZERO);
if (m == bogus_page) {
- obj = (vm_object_t) vp->v_object;
+ VOP_GETVOBJECT(vp, &obj);
poff = OFF_TO_IDX(bp->b_offset);
for (j = i; j < bp->b_npages; j++) {
@@ -1905,10 +1905,9 @@ inmem(struct vnode * vp, daddr_t blkno)
return 1;
if (vp->v_mount == NULL)
return 0;
- if ((vp->v_object == NULL) || (vp->v_flag & VOBJBUF) == 0)
+ if (VOP_GETVOBJECT(vp, &obj) != 0 || (vp->v_flag & VOBJBUF) == 0)
return 0;
- obj = vp->v_object;
size = PAGE_SIZE;
if (size > vp->v_mount->mnt_stat.f_iosize)
size = vp->v_mount->mnt_stat.f_iosize;
@@ -2193,7 +2192,7 @@ loop:
bsize = size;
offset = (off_t)blkno * bsize;
- vmio = (vp->v_object != 0) && (vp->v_flag & VOBJBUF);
+ vmio = (VOP_GETVOBJECT(vp, NULL) == 0) && (vp->v_flag & VOBJBUF);
maxsize = vmio ? size + (offset & PAGE_MASK) : size;
maxsize = imax(maxsize, bsize);
@@ -2462,7 +2461,7 @@ allocbuf(struct buf *bp, int size)
*/
vp = bp->b_vp;
- obj = vp->v_object;
+ VOP_GETVOBJECT(vp, &obj);
while (bp->b_npages < desiredpages) {
vm_page_t m;
@@ -2641,7 +2640,7 @@ bufdonebio(struct bio *bp)
void
bufdone(struct buf *bp)
{
- int s;
+ int s, error;
void (*biodone) __P((struct buf *));
s = splbio();
@@ -2680,14 +2679,14 @@ bufdone(struct buf *bp)
int iosize;
struct vnode *vp = bp->b_vp;
- obj = vp->v_object;
+ error = VOP_GETVOBJECT(vp, &obj);
#if defined(VFS_BIO_DEBUG)
if (vp->v_usecount == 0) {
panic("biodone: zero vnode ref count");
}
- if (vp->v_object == NULL) {
+ if (error) {
panic("biodone: missing VM object");
}
@@ -2700,7 +2699,7 @@ bufdone(struct buf *bp)
KASSERT(bp->b_offset != NOOFFSET,
("biodone: no buffer offset"));
- if (!obj) {
+ if (error) {
panic("biodone: no object");
}
#if defined(VFS_BIO_DEBUG)
@@ -2821,7 +2820,9 @@ vfs_unbusy_pages(struct buf * bp)
if (bp->b_flags & B_VMIO) {
struct vnode *vp = bp->b_vp;
- vm_object_t obj = vp->v_object;
+ vm_object_t obj;
+
+ VOP_GETVOBJECT(vp, &obj);
for (i = 0; i < bp->b_npages; i++) {
vm_page_t m = bp->b_pages[i];
@@ -2898,9 +2899,10 @@ vfs_busy_pages(struct buf * bp, int clear_modify)
if (bp->b_flags & B_VMIO) {
struct vnode *vp = bp->b_vp;
- vm_object_t obj = vp->v_object;
+ vm_object_t obj;
vm_ooffset_t foff;
+ VOP_GETVOBJECT(vp, &obj);
foff = bp->b_offset;
KASSERT(bp->b_offset != NOOFFSET,
("vfs_busy_pages: no buffer offset"));
OpenPOWER on IntegriCloud