Index: sys/kern/vnode_if.sh
===================================================================
RCS file: /cvsroot/src/sys/kern/vnode_if.sh,v
retrieving revision 1.57
diff -p -u -4 -r1.57 vnode_if.sh
--- sys/kern/vnode_if.sh	3 Apr 2011 01:19:37 -0000	1.57
+++ sys/kern/vnode_if.sh	6 Jul 2011 15:09:45 -0000
@@ -246,9 +246,8 @@ function doit() {
 	}
 	printf(");\n");
 }
 BEGIN	{
-	arg0special="";
 	vop_offset = 1; # start at 1, to count the 'default' op
 
 	printf("struct buf;\n");
 	if (rump) {
@@ -256,18 +255,8 @@ BEGIN	{
 		printf("struct knote;\n");
 		printf("struct vm_page;\n");
 	}
 	printf("\n#ifndef _KERNEL\n#include <stdbool.h>\n#endif\n");
-	printf("\n/* Special cases: */\n");
-
-	argc=1;
-	argtype[0]="struct buf *";
-	argname[0]="bp";
-	lockstate[0] = -1;
-	arg0special="->b_vp";
-	name="vop_bwrite";
-	doit();
-	printf("\n/* End of special cases */\n");
 	if (rump)
 		printf("\n");
 }
 END	{
@@ -419,12 +408,12 @@ function bodynorm() {
 			printf("\t\tpanic(\"%s: %s: locked %%d, expected %%d\", islocked_%s, %d);\n", name, argname[i], argname[i], lockstate[i]);
 			printf("#endif\n");
 		}
 	}
-	printf("\tmpsafe = (%s%s->v_vflag & VV_MPSAFE);\n", argname[0], arg0special);
+	printf("\tmpsafe = (%s->v_vflag & VV_MPSAFE);\n", argname[0]);
 	printf("\tif (!mpsafe) { KERNEL_LOCK(1, curlwp); }\n");
-	printf("\terror = (VCALL(%s%s, VOFFSET(%s), &a));\n",
-		argname[0], arg0special, name);
+	printf("\terror = (VCALL(%s, VOFFSET(%s), &a));\n",
+		argname[0], name);
 	printf("\tif (!mpsafe) { KERNEL_UNLOCK_ONE(curlwp); }\n");
 	if (willmake != -1) {
 		printf("#ifdef DIAGNOSTIC\n");
 		printf("\tif (error == 0)\n"				\
@@ -459,23 +448,10 @@ function doit() {
 	else
 		bodynorm();
 }
 BEGIN	{
-	printf("\n/* Special cases: */\n");
 	# start from 1 (vop_default is at 0)
 	argc=1;
-	willmake=-1;
-	argdir[0]="IN";
-	argtype[0]="struct buf *";
-	argname[0]="bp";
-	lockstate[0] = -1;
-	arg0special="->b_vp";
-	willrele[0]=0;
-	name="vop_bwrite";
-	doit();
-	printf("\n/* End of special cases */\n");
-
-	arg0special="";
 }
 '"$awk_parser" | sed -e "$anal_retentive"
 
 # End stuff
@@ -485,9 +461,8 @@ BEGIN	{
 # Begin stuff
 echo "
 const struct vnodeop_desc * const ${rump}vfs_op_descs[] = {
 	&${rump}vop_default_desc,	/* MUST BE FIRST */
-	&${rump}vop_bwrite_desc,	/* XXX: SPECIAL CASE */
 "
 
 # Body stuff
 sed -e "$sed_prep" $src | $awk -v rump=${rump} '
Index: sys/kern/vnode_if.src
===================================================================
RCS file: /cvsroot/src/sys/kern/vnode_if.src,v
retrieving revision 1.61
diff -p -u -4 -r1.61 vnode_if.src
--- sys/kern/vnode_if.src	2 Apr 2011 23:05:50 -0000	1.61
+++ sys/kern/vnode_if.src	6 Jul 2011 15:09:45 -0000
@@ -49,8 +49,16 @@
 # For operations other than VOP_LOOKUP which require a component name
 # parameter, the flags required for the initial namei() call are listed.
 # Additional flags may be added to the namei() call, but these are required.
 #     
+
+#
+#% bwrite     vp      = = =
+#
+vop_bwrite {
+	IN struct vnode *vp;
+	IN struct buf *bp;
+};
  
 #
 #% lookup     dvp     L L L
 #% lookup     vpp     - L -
@@ -456,15 +464,8 @@ vop_whiteout {
 	IN int flags;
 };
 
 #
-# Needs work: no vp?
-#
-#vop_bwrite {
-#	IN struct buf *bp;
-#};
-
-#
 #% getpages	vp = = =
 #
 vop_getpages {
 	IN struct vnode *vp;
@@ -515,8 +516,9 @@ vop_listextattr {
 	IN LOCKED=YES struct vnode *vp;
 	IN int attrnamespace;
 	INOUT struct uio *uio;
 	OUT size_t *size;
+	IN int flag;
 	IN kauth_cred_t cred;
 };
 
 #
Index: sys/miscfs/genfs/layer_extern.h
===================================================================
RCS file: /cvsroot/src/sys/miscfs/genfs/layer_extern.h,v
retrieving revision 1.28
diff -p -u -4 -r1.28 layer_extern.h
--- sys/miscfs/genfs/layer_extern.h	6 Mar 2011 17:08:36 -0000	1.28
+++ sys/miscfs/genfs/layer_extern.h	6 Jul 2011 15:09:45 -0000
@@ -103,9 +103,8 @@ int	layer_bypass(void *);
 int	layer_getattr(void *);
 int	layer_inactive(void *);
 int	layer_reclaim(void *);
 int	layer_print(void *);
-int	layer_bwrite(void *);
 int	layer_bmap(void *);
 int	layer_fsync(void *);
 int	layer_lookup(void *);
 int	layer_setattr(void *);
Index: sys/miscfs/genfs/layer_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/miscfs/genfs/layer_vnops.c,v
retrieving revision 1.48
diff -p -u -4 -r1.48 layer_vnops.c
--- sys/miscfs/genfs/layer_vnops.c	12 Jun 2011 03:35:58 -0000	1.48
+++ sys/miscfs/genfs/layer_vnops.c	6 Jul 2011 15:09:45 -0000
@@ -732,31 +739,8 @@ layer_print(void *v)
 	printf ("\ttag VT_LAYERFS, vp=%p, lowervp=%p\n", vp, LAYERVPTOLOWERVP(vp));
 	return 0;
 }
 
-/*
- * XXX - vop_bwrite must be hand coded because it has no
- * vnode in its arguments.
- * This goes away with a merged VM/buffer cache.
- */
-int
-layer_bwrite(void *v)
-{
-	struct vop_bwrite_args /* {
-		struct buf *a_bp;
-	} */ *ap = v;
-	struct buf *bp = ap->a_bp;
-	struct vnode *savedvp;
-	int error;
-
-	savedvp = bp->b_vp;
-	bp->b_vp = LAYERVPTOLOWERVP(bp->b_vp);
-	error = VOP_BWRITE(bp);
-	bp->b_vp = savedvp;
-
-	return error;
-}
-
 int
 layer_getpages(void *v)
 {
 	struct vop_getpages_args /* {
Index: sys/miscfs/nullfs/null_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/miscfs/nullfs/null_vnops.c,v
retrieving revision 1.37
diff -p -u -4 -r1.37 null_vnops.c
--- sys/miscfs/nullfs/null_vnops.c	10 Jan 2011 11:11:03 -0000	1.37
+++ sys/miscfs/nullfs/null_vnops.c	6 Jul 2011 15:09:45 -0000
@@ -113,9 +113,8 @@ const struct vnodeopv_entry_desc null_vn
 	{ &vop_rmdir_desc,	layer_rmdir },
 
 	{ &vop_open_desc,	layer_open },	/* mount option handling */
 
-	{ &vop_bwrite_desc,	layer_bwrite },
 	{ &vop_bmap_desc,	layer_bmap },
 	{ &vop_getpages_desc,	layer_getpages },
 	{ &vop_putpages_desc,	layer_putpages },
 
Index: sys/miscfs/overlay/overlay_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/miscfs/overlay/overlay_vnops.c,v
retrieving revision 1.18
diff -p -u -4 -r1.18 overlay_vnops.c
--- sys/miscfs/overlay/overlay_vnops.c	10 Jan 2011 11:11:03 -0000	1.18
+++ sys/miscfs/overlay/overlay_vnops.c	6 Jul 2011 15:09:45 -0000
@@ -162,9 +162,8 @@ const struct vnodeopv_entry_desc overlay
 	{ &vop_rmdir_desc,    layer_rmdir },
 
 	{ &vop_open_desc,     layer_open },	/* mount option handling */
 
-	{ &vop_bwrite_desc,   layer_bwrite },
 	{ &vop_bmap_desc,     layer_bmap },
 	{ &vop_getpages_desc, layer_getpages },
 	{ &vop_putpages_desc, layer_putpages },
 
Index: sys/miscfs/umapfs/umap_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/miscfs/umapfs/umap_vnops.c,v
retrieving revision 1.52
diff -p -u -4 -r1.52 umap_vnops.c
--- sys/miscfs/umapfs/umap_vnops.c	3 Apr 2011 01:19:36 -0000	1.52
+++ sys/miscfs/umapfs/umap_vnops.c	6 Jul 2011 15:09:46 -0000
@@ -95,9 +95,8 @@ const struct vnodeopv_entry_desc umap_vn
 	{ &vop_remove_desc,	layer_remove },
 	{ &vop_revoke_desc,	layer_revoke },
 	{ &vop_rmdir_desc,	layer_rmdir },
 
-	{ &vop_bwrite_desc,	layer_bwrite },
 	{ &vop_bmap_desc,	layer_bmap },
 	{ &vop_getpages_desc,	layer_getpages },
 	{ &vop_putpages_desc,	layer_putpages },

Index: sys/kern/vnode_if.c
===================================================================
RCS file: /cvsroot/src/sys/kern/vnode_if.c,v
retrieving revision 1.87
diff -p -u -4 -r1.87 vnode_if.c
--- sys/kern/vnode_if.c	4 Jul 2011 08:07:31 -0000	1.87
+++ sys/kern/vnode_if.c	6 Jul 2011 15:09:45 -0000
@@ -1,14 +1,14 @@
-/*	$NetBSD: vnode_if.c,v 1.87 2011/07/04 08:07:31 manu Exp $	*/
+/*	$NetBSD$	*/
 
 /*
  * Warning: DO NOT EDIT! This file is automatically generated!
  * (Modifications made here may easily be lost!)
  *
  * Created from the file:
- *	NetBSD: vnode_if.src,v 1.60 2011/01/02 06:58:45 dholland Exp
+ *	NetBSD: vnode_if.src,v 1.61 2011/04/02 23:05:50 rmind Exp
  * by the script:
- *	NetBSD: vnode_if.sh,v 1.56 2010/04/14 13:58:51 pooka Exp
+ *	NetBSD: vnode_if.sh,v 1.57 2011/04/03 01:19:37 rmind Exp
  */
 
 /*
  * Copyright (c) 1992, 1993, 1994, 1995
@@ -39,9 +39,9 @@
  * SUCH DAMAGE.
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vnode_if.c,v 1.87 2011/07/04 08:07:31 manu Exp $");
+__KERNEL_RCSID(0, "$NetBSD$");
 
 #include <sys/param.h>
 #include <sys/mount.h>
 #include <sys/buf.h>
@@ -58,11 +58,10 @@ const struct vnodeop_desc vop_default_de
 	VDESC_NO_OFFSET,
 };
 
 
-/* Special cases: */
-
 const int vop_bwrite_vp_offsets[] = {
+	VOPARG_OFFSETOF(struct vop_bwrite_args,a_vp),
 	VDESC_NO_OFFSET
 };
 const struct vnodeop_desc vop_bwrite_desc = {
 	VOP_BWRITE_DESCOFFSET,
@@ -73,24 +72,24 @@ const struct vnodeop_desc vop_bwrite_des
 	VDESC_NO_OFFSET,
 	VDESC_NO_OFFSET,
 };
 int
-VOP_BWRITE(struct buf *bp)
+VOP_BWRITE(struct vnode *vp,
+    struct buf *bp)
 {
 	int error;
 	bool mpsafe;
 	struct vop_bwrite_args a;
 	a.a_desc = VDESC(vop_bwrite);
+	a.a_vp = vp;
 	a.a_bp = bp;
-	mpsafe = (bp->b_vp->v_vflag & VV_MPSAFE);
+	mpsafe = (vp->v_vflag & VV_MPSAFE);
 	if (!mpsafe) { KERNEL_LOCK(1, curlwp); }
-	error = (VCALL(bp->b_vp, VOFFSET(vop_bwrite), &a));
+	error = (VCALL(vp, VOFFSET(vop_bwrite), &a));
 	if (!mpsafe) { KERNEL_UNLOCK_ONE(curlwp); }
 	return error;
 }
 
-/* End of special cases */
-
 const int vop_lookup_vp_offsets[] = {
 	VOPARG_OFFSETOF(struct vop_lookup_args,a_dvp),
 	VDESC_NO_OFFSET
 };
@@ -1640,10 +1639,10 @@ VOP_SETEXTATTR(struct vnode *vp,
 }
 
 const struct vnodeop_desc * const vfs_op_descs[] = {
 	&vop_default_desc,	/* MUST BE FIRST */
-	&vop_bwrite_desc,	/* XXX: SPECIAL CASE */
 
+	&vop_bwrite_desc,
 	&vop_lookup_desc,
 	&vop_create_desc,
 	&vop_mknod_desc,
 	&vop_open_desc,
Index: sys/rump/include/rump/rumpvnode_if.h
===================================================================
RCS file: /cvsroot/src/sys/rump/include/rump/rumpvnode_if.h,v
retrieving revision 1.10
diff -p -u -4 -r1.10 rumpvnode_if.h
--- sys/rump/include/rump/rumpvnode_if.h	4 Jul 2011 08:07:31 -0000	1.10
+++ sys/rump/include/rump/rumpvnode_if.h	6 Jul 2011 15:09:46 -0000
@@ -1,14 +1,14 @@
-/*	$NetBSD: rumpvnode_if.h,v 1.10 2011/07/04 08:07:31 manu Exp $	*/
+/*	$NetBSD$	*/
 
 /*
  * Warning: DO NOT EDIT! This file is automatically generated!
  * (Modifications made here may easily be lost!)
  *
  * Created from the file:
- *	NetBSD: vnode_if.src,v 1.60 2011/01/02 06:58:45 dholland Exp
+ *	NetBSD: vnode_if.src,v 1.61 2011/04/02 23:05:50 rmind Exp
  * by the script:
- *	NetBSD: vnode_if.sh,v 1.56 2010/04/14 13:58:51 pooka Exp
+ *	NetBSD: vnode_if.sh,v 1.57 2011/04/03 01:19:37 rmind Exp
  */
 
 /*
  * Copyright (c) 1992, 1993, 1994, 1995
@@ -50,13 +50,9 @@ struct vm_page;
 #ifndef _KERNEL
 #include <stdbool.h>
 #endif
 
-/* Special cases: */
-int RUMP_VOP_BWRITE(struct buf *);
-
-/* End of special cases */
-
+int RUMP_VOP_BWRITE(struct vnode *, struct buf *);
 int RUMP_VOP_LOOKUP(struct vnode *, struct vnode **, struct componentname *);
 int RUMP_VOP_CREATE(struct vnode *, struct vnode **, struct componentname *, 
     struct vattr *);
 int RUMP_VOP_MKNOD(struct vnode *, struct vnode **, struct componentname *, 
@@ -105,10 +101,10 @@ int RUMP_VOP_GETPAGES(struct vnode *, of
 int RUMP_VOP_PUTPAGES(struct vnode *, off_t, off_t, int);
 int RUMP_VOP_CLOSEEXTATTR(struct vnode *, int, struct kauth_cred *);
 int RUMP_VOP_GETEXTATTR(struct vnode *, int, const char *, struct uio *, 
     size_t *, struct kauth_cred *);
-int RUMP_VOP_LISTEXTATTR(struct vnode *, int, struct uio *, size_t *, 
-    int, struct kauth_cred *);
+int RUMP_VOP_LISTEXTATTR(struct vnode *, int, struct uio *, size_t *, int, 
+    struct kauth_cred *);
 int RUMP_VOP_OPENEXTATTR(struct vnode *, struct kauth_cred *);
 int RUMP_VOP_DELETEEXTATTR(struct vnode *, int, const char *, 
     struct kauth_cred *);
 int RUMP_VOP_SETEXTATTR(struct vnode *, int, const char *, struct uio *, 
Index: sys/rump/librump/rumpvfs/rumpvnode_if.c
===================================================================
RCS file: /cvsroot/src/sys/rump/librump/rumpvfs/rumpvnode_if.c,v
retrieving revision 1.9
diff -p -u -4 -r1.9 rumpvnode_if.c
--- sys/rump/librump/rumpvfs/rumpvnode_if.c	4 Jul 2011 08:07:31 -0000	1.9
+++ sys/rump/librump/rumpvfs/rumpvnode_if.c	6 Jul 2011 15:09:46 -0000
@@ -1,14 +1,14 @@
-/*	$NetBSD: rumpvnode_if.c,v 1.9 2011/07/04 08:07:31 manu Exp $	*/
+/*	$NetBSD$	*/
 
 /*
  * Warning: DO NOT EDIT! This file is automatically generated!
  * (Modifications made here may easily be lost!)
  *
  * Created from the file:
- *	NetBSD: vnode_if.src,v 1.60 2011/01/02 06:58:45 dholland Exp
+ *	NetBSD: vnode_if.src,v 1.61 2011/04/02 23:05:50 rmind Exp
  * by the script:
- *	NetBSD: vnode_if.sh,v 1.56 2010/04/14 13:58:51 pooka Exp
+ *	NetBSD: vnode_if.sh,v 1.57 2011/04/03 01:19:37 rmind Exp
  */
 
 /*
  * Copyright (c) 1992, 1993, 1994, 1995
@@ -39,9 +39,9 @@
  * SUCH DAMAGE.
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpvnode_if.c,v 1.9 2011/07/04 08:07:31 manu Exp $");
+__KERNEL_RCSID(0, "$NetBSD$");
 
 #include <sys/param.h>
 #include <sys/mount.h>
 #include <sys/buf.h>
@@ -49,24 +49,21 @@ __KERNEL_RCSID(0, "$NetBSD: rumpvnode_if
 #include <sys/lock.h>
 #include <rump/rumpvnode_if.h>
 #include "rump_private.h"
 
-/* Special cases: */
-
 int
-RUMP_VOP_BWRITE(struct buf *bp)
+RUMP_VOP_BWRITE(struct vnode *vp,
+    struct buf *bp)
 {
 	int error;
 
 	rump_schedule();
-	error = VOP_BWRITE(bp);
+	error = VOP_BWRITE(vp, bp);
 	rump_unschedule();
 
 	return error;
 }
 
-/* End of special cases */
-
 int
 RUMP_VOP_LOOKUP(struct vnode *dvp,
     struct vnode **vpp,
     struct componentname *cnp)
Index: sys/sys/vnode_if.h
===================================================================
RCS file: /cvsroot/src/sys/sys/vnode_if.h,v
retrieving revision 1.81
diff -p -u -4 -r1.81 vnode_if.h
--- sys/sys/vnode_if.h	4 Jul 2011 08:07:31 -0000	1.81
+++ sys/sys/vnode_if.h	6 Jul 2011 15:09:47 -0000
@@ -1,14 +1,14 @@
-/*	$NetBSD: vnode_if.h,v 1.81 2011/07/04 08:07:31 manu Exp $	*/
+/*	$NetBSD$	*/
 
 /*
  * Warning: DO NOT EDIT! This file is automatically generated!
  * (Modifications made here may easily be lost!)
  *
  * Created from the file:
- *	NetBSD: vnode_if.src,v 1.60 2011/01/02 06:58:45 dholland Exp
+ *	NetBSD: vnode_if.src,v 1.61 2011/04/02 23:05:50 rmind Exp
  * by the script:
- *	NetBSD: vnode_if.sh,v 1.56 2010/04/14 13:58:51 pooka Exp
+ *	NetBSD: vnode_if.sh,v 1.57 2011/04/03 01:19:37 rmind Exp
  */
 
 /*
  * Copyright (c) 1992, 1993, 1994, 1995
@@ -49,19 +49,16 @@ struct buf;
 #ifndef _KERNEL
 #include <stdbool.h>
 #endif
 
-/* Special cases: */
-
 #define VOP_BWRITE_DESCOFFSET 1
 struct vop_bwrite_args {
 	const struct vnodeop_desc *a_desc;
+	struct vnode *a_vp;
 	struct buf *a_bp;
 };
 extern const struct vnodeop_desc vop_bwrite_desc;
-int VOP_BWRITE(struct buf *);
-
-/* End of special cases */
+int VOP_BWRITE(struct vnode *, struct buf *);
 
 #define VOP_LOOKUP_DESCOFFSET 2
 struct vop_lookup_args {
 	const struct vnodeop_desc *a_desc;
@@ -518,10 +515,10 @@ struct vop_listextattr_args {
 	int a_flag;
 	kauth_cred_t a_cred;
 };
 extern const struct vnodeop_desc vop_listextattr_desc;
-int VOP_LISTEXTATTR(struct vnode *, int, struct uio *, size_t *, 
-    int, kauth_cred_t);
+int VOP_LISTEXTATTR(struct vnode *, int, struct uio *, size_t *, int, 
+    kauth_cred_t);
 
 #define VOP_OPENEXTATTR_DESCOFFSET 45
 struct vop_openextattr_args {
 	const struct vnodeop_desc *a_desc;
 
Index: sys/kern/vfs_bio.c
===================================================================
RCS file: /cvsroot/src/sys/kern/vfs_bio.c,v
retrieving revision 1.230
diff -p -u -4 -r1.230 vfs_bio.c
--- sys/kern/vfs_bio.c	12 Jun 2011 03:35:56 -0000	1.230
+++ sys/kern/vfs_bio.c	6 Jul 2011 15:09:45 -0000
@@ -950,11 +950,12 @@ void
 bawrite(buf_t *bp)
 {
 
 	KASSERT(ISSET(bp->b_cflags, BC_BUSY));
+	KASSERT(bp->b_vp != NULL);
 
 	SET(bp->b_flags, B_ASYNC);
-	VOP_BWRITE(bp);
+	VOP_BWRITE(bp->b_vp, bp);
 }
 
 /*
  * Release a buffer on to the free lists.

A bunch of changes like this omitted from diff.

-	if ((error = VOP_BWRITE(bp)) != 0)
+	if ((error = VOP_BWRITE(bp->b_vp, bp)) != 0)
