changeset 5050:e67c98912955

PSARC 2007/456 Vnode Specific Data 6588504 VSD: Stop polluting the vnode. 6591603 Use VSD to store and retrieve the "file" struct 6591606 rfs_create() passes the wrong vnode to rfs4_check_delegated
author jwahlig
date Fri, 14 Sep 2007 11:24:08 -0700
parents 09764a26229e
children cbbb7c8b40a9
files usr/src/uts/common/fs/nfs/nfs4_srv.c usr/src/uts/common/fs/nfs/nfs4_state.c usr/src/uts/common/fs/nfs/nfs_srv.c usr/src/uts/common/fs/vnode.c usr/src/uts/common/sys/vnode.h
diffstat 5 files changed, 822 insertions(+), 588 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/nfs/nfs4_srv.c	Fri Sep 14 10:25:36 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs4_srv.c	Fri Sep 14 11:24:08 2007 -0700
@@ -145,6 +145,7 @@
 static sysid_t lockt_sysid;		/* dummy sysid for all LOCKT calls */
 
 u_longlong_t nfs4_srv_caller_id;
+uint_t nfs4_srv_vkey = 0;
 
 verifier4	Write4verf;
 verifier4	Readdir4verf;
@@ -547,7 +548,7 @@
 		rfs4_disable_delegation();
 	} else {
 		error = fem_create("deleg_wrops", nfs4_wr_deleg_tmpl,
-				&deleg_wrops);
+		    &deleg_wrops);
 		if (error != 0) {
 			rfs4_disable_delegation();
 			fem_free(deleg_rdops);
@@ -558,6 +559,8 @@
 
 	lockt_sysid = lm_alloc_sysidt();
 
+	vsd_create(&nfs4_srv_vkey, NULL);
+
 	return (0);
 }
 
@@ -868,6 +871,7 @@
 	uint_t count, i;
 	secinfo4 *resok_val;
 	struct secinfo *secp;
+	seconfig_t *si;
 	bool_t did_traverse;
 	int dotdot, walk;
 
@@ -1017,25 +1021,25 @@
 		secp = exi->exi_export.ex_secinfo;
 
 		for (i = 0; i < count; i++) {
-		    resok_val[i].flavor = secp[i].s_secinfo.sc_rpcnum;
-		    if (resok_val[i].flavor == RPCSEC_GSS) {
-			rpcsec_gss_info *info;
-
-			info = &resok_val[i].flavor_info;
-			info->qop = secp[i].s_secinfo.sc_qop;
-			info->service =
-				(rpc_gss_svc_t)secp[i].s_secinfo.sc_service;
-
-			/* get oid opaque data */
-			info->oid.sec_oid4_len =
-				secp[i].s_secinfo.sc_gss_mech_type->length;
-			info->oid.sec_oid4_val =
-				kmem_alloc(
-				    secp[i].s_secinfo.sc_gss_mech_type->length,
-				    KM_SLEEP);
-			bcopy(secp[i].s_secinfo.sc_gss_mech_type->elements,
-				info->oid.sec_oid4_val, info->oid.sec_oid4_len);
-		    }
+			si = &secp[i].s_secinfo;
+			resok_val[i].flavor = si->sc_rpcnum;
+			if (resok_val[i].flavor == RPCSEC_GSS) {
+				rpcsec_gss_info *info;
+
+				info = &resok_val[i].flavor_info;
+				info->qop = si->sc_qop;
+				info->service = (rpc_gss_svc_t)si->sc_service;
+
+				/* get oid opaque data */
+				info->oid.sec_oid4_len =
+				    si->sc_gss_mech_type->length;
+				info->oid.sec_oid4_val = kmem_alloc(
+				    si->sc_gss_mech_type->length, KM_SLEEP);
+				bcopy(
+				    si->sc_gss_mech_type->elements,
+				    info->oid.sec_oid4_val,
+				    info->oid.sec_oid4_len);
+			}
 		}
 		resp->SECINFO4resok_len = count;
 		resp->SECINFO4resok_val = resok_val;
@@ -1055,7 +1059,7 @@
 			perm = secp[i].s_flags;
 
 			access = nfsauth4_secinfo_access(exi, cs->req,
-						flavor, perm);
+			    flavor, perm);
 
 			if (! (access & NFSAUTH_DENIED) &&
 			    ! (access & NFSAUTH_WRONGSEC)) {
@@ -1069,30 +1073,31 @@
 
 		for (i = 0; i < count; i++) {
 		/* If the flavor is in the flavor list, fill in resok_val. */
-		    if (in_flavor_list(secp[i].s_secinfo.sc_nfsnum,
-						flavor_list, ret_cnt)) {
-			resok_val[k].flavor = secp[i].s_secinfo.sc_rpcnum;
-			if (resok_val[k].flavor == RPCSEC_GSS) {
-			    rpcsec_gss_info *info;
-
-			    info = &resok_val[k].flavor_info;
-			    info->qop = secp[i].s_secinfo.sc_qop;
-			    info->service =
-				(rpc_gss_svc_t)secp[i].s_secinfo.sc_service;
-
-			    /* get oid opaque data */
-			    info->oid.sec_oid4_len =
-				secp[i].s_secinfo.sc_gss_mech_type->length;
-			    info->oid.sec_oid4_val =
-				kmem_alloc(
-				    secp[i].s_secinfo.sc_gss_mech_type->length,
-				    KM_SLEEP);
-			    bcopy(secp[i].s_secinfo.sc_gss_mech_type->elements,
-				info->oid.sec_oid4_val, info->oid.sec_oid4_len);
+			si = &secp[i].s_secinfo;
+			if (in_flavor_list(si->sc_nfsnum,
+			    flavor_list, ret_cnt)) {
+				resok_val[k].flavor = si->sc_rpcnum;
+				if (resok_val[k].flavor == RPCSEC_GSS) {
+					rpcsec_gss_info *info;
+
+					info = &resok_val[k].flavor_info;
+					info->qop = si->sc_qop;
+					info->service = (rpc_gss_svc_t)
+					    si->sc_service;
+
+					/* get oid opaque data */
+					info->oid.sec_oid4_len =
+					    si->sc_gss_mech_type->length;
+					info->oid.sec_oid4_val = kmem_alloc(
+					    si->sc_gss_mech_type->length,
+					    KM_SLEEP);
+					bcopy(si->sc_gss_mech_type->elements,
+					    info->oid.sec_oid4_val,
+					    info->oid.sec_oid4_len);
+				}
+				k++;
 			}
-			k++;
-		    }
-		    if (k >= ret_cnt)
+		if (k >= ret_cnt)
 			break;
 		}
 		resp->SECINFO4resok_len = ret_cnt;
@@ -1140,8 +1145,8 @@
 	 */
 	if (!utf8_dir_verify(utfnm)) {
 		if (utfnm->utf8string_len != 2 ||
-				utfnm->utf8string_val[0] != '.' ||
-				utfnm->utf8string_val[1] != '.') {
+		    utfnm->utf8string_val[0] != '.' ||
+		    utfnm->utf8string_val[1] != '.') {
 			*cs->statusp = resp->status = NFS4ERR_INVAL;
 			return;
 		}
@@ -1184,12 +1189,13 @@
 	resok_val = resp->SECINFO4resok_val;
 
 	for (i = 0; i < count; i++) {
-	    if (resok_val[i].flavor == RPCSEC_GSS) {
-		rpcsec_gss_info *info;
-
-		info = &resok_val[i].flavor_info;
-		kmem_free(info->oid.sec_oid4_val, info->oid.sec_oid4_len);
-	    }
+		if (resok_val[i].flavor == RPCSEC_GSS) {
+			rpcsec_gss_info *info;
+
+			info = &resok_val[i].flavor_info;
+			kmem_free(info->oid.sec_oid4_val,
+			    info->oid.sec_oid4_len);
+		}
 	}
 	kmem_free(resok_val, count * sizeof (secinfo4));
 	resp->SECINFO4resok_len = 0;
@@ -1234,7 +1240,7 @@
 	 * permissions are sent back to the client for interpretation.
 	 */
 	if (rdonly4(cs->exi, cs->vp, req) &&
-		(vp->v_type == VREG || vp->v_type == VDIR))
+	    (vp->v_type == VREG || vp->v_type == VDIR))
 		checkwriteperm = 0;
 	else
 		checkwriteperm = 1;
@@ -1423,7 +1429,7 @@
 		else
 			vap->va_type = VBLK;
 		vap->va_rdev = makedevice(args->ftype4_u.devdata.specdata1,
-					args->ftype4_u.devdata.specdata2);
+		    args->ftype4_u.devdata.specdata2);
 		vap->va_mask |= AT_RDEV;
 		break;
 	case NF4SOCK:
@@ -1550,8 +1556,7 @@
 	nfs4_ntov_table_init(&ntov);
 
 	status = do_rfs4_set_attrs(&resp->attrset,
-					&args->createattrs, cs, &sarg,
-					&ntov, NFS4ATTR_SETIT);
+	    &args->createattrs, cs, &sarg, &ntov, NFS4ATTR_SETIT);
 
 	if (sarg.vap->va_mask == 0 && status == NFS4_OK)
 		status = NFS4ERR_INVAL;
@@ -1664,7 +1669,7 @@
 		 */
 		iva2.va_mask = AT_SEQ;
 		if (VOP_GETATTR(dvp, &iva2, 0, cs->cr) ||
-						iva2.va_seq != iva.va_seq)
+		    iva2.va_seq != iva.va_seq)
 			iva.va_seq = 0;
 		break;
 	default:
@@ -1764,8 +1769,7 @@
 	 * or VOP_FSYNC.
 	 */
 	if (!error && bva.va_seq && iva.va_seq && ava.va_seq &&
-			iva.va_seq == (bva.va_seq + 1) &&
-			iva.va_seq == ava.va_seq)
+	    iva.va_seq == (bva.va_seq + 1) && iva.va_seq == ava.va_seq)
 		resp->cinfo.atomic = TRUE;
 	else
 		resp->cinfo.atomic = FALSE;
@@ -1920,7 +1924,7 @@
 	sargp->mntdfid_set = FALSE;
 	if (sargp->cs->vp)
 		sargp->xattr = get_fh4_flag(&sargp->cs->fh,
-					    FH4_ATTRDIR | FH4_NAMEDATTR);
+		    FH4_ATTRDIR | FH4_NAMEDATTR);
 	else
 		sargp->xattr = 0;
 
@@ -1959,7 +1963,7 @@
 		va_mask = 0;
 		for (i = 0; i < nfs4_ntov_map_size; i++) {
 			if ((breq & nfs4_ntov_map[i].fbit) &&
-							nfs4_ntov_map[i].vbit)
+			    nfs4_ntov_map[i].vbit)
 				va_mask |= nfs4_ntov_map[i].vbit;
 		}
 
@@ -2001,7 +2005,7 @@
 nfs4_ntov_table_init(struct nfs4_ntov_table *ntovp)
 {
 	ntovp->na = kmem_zalloc(sizeof (union nfs4_attr_u) * nfs4_ntov_map_size,
-			KM_SLEEP);
+	    KM_SLEEP);
 	ntovp->attrcnt = 0;
 	ntovp->vfsstat = FALSE;
 }
@@ -2018,16 +2022,16 @@
 	 * XXX Should do the same checks for whether the bit is set
 	 */
 	for (i = 0, na = ntovp->na, amap = ntovp->amap;
-		i < ntovp->attrcnt; i++, na++, amap++) {
+	    i < ntovp->attrcnt; i++, na++, amap++) {
 		(void) (*nfs4_ntov_map[*amap].sv_getit)(
-			NFS4ATTR_FREEIT, sargp, na);
+		    NFS4ATTR_FREEIT, sargp, na);
 	}
 	if ((sargp->op == NFS4ATTR_SETIT) || (sargp->op == NFS4ATTR_VERIT)) {
 		/*
 		 * xdr_free for getattr will be done later
 		 */
 		for (i = 0, na = ntovp->na, amap = ntovp->amap;
-			i < ntovp->attrcnt; i++, na++, amap++) {
+		    i < ntovp->attrcnt; i++, na++, amap++) {
 			xdr_free(nfs4_ntov_map[*amap].xfunc, (caddr_t)na);
 		}
 	}
@@ -2079,10 +2083,10 @@
 	for (i = 0; i < nfs4_ntov_map_size; i++) {
 		if (breq & nfs4_ntov_map[i].fbit) {
 			if ((*nfs4_ntov_map[i].sv_getit)(
-				    NFS4ATTR_SUPPORTED, sargp, NULL) == 0) {
+			    NFS4ATTR_SUPPORTED, sargp, NULL) == 0) {
 
 				error = (*nfs4_ntov_map[i].sv_getit)(
-						NFS4ATTR_GETIT, sargp, na);
+				    NFS4ATTR_GETIT, sargp, na);
 
 				/*
 				 * Possible error values:
@@ -2098,13 +2102,13 @@
 				 */
 				if (error == 0) {
 					fattrp->attrmask |=
-						nfs4_ntov_map[i].fbit;
+					    nfs4_ntov_map[i].fbit;
 					*amap++ =
-						(uint8_t)nfs4_ntov_map[i].nval;
+					    (uint8_t)nfs4_ntov_map[i].nval;
 					na++;
 					(ntov.attrcnt)++;
 				} else if ((error > 0) &&
-					(sargp->rdattr_error == NFS4_OK)) {
+				    (sargp->rdattr_error == NFS4_OK)) {
 					sargp->rdattr_error = puterrno4(error);
 				}
 				error = 0;
@@ -2126,10 +2130,10 @@
 			}
 			if ((k == FATTR4_RDATTR_ERROR) &&
 			    ((*nfs4_ntov_map[k].sv_getit)(
-				NFS4ATTR_SUPPORTED, sargp, NULL) == 0)) {
+			    NFS4ATTR_SUPPORTED, sargp, NULL) == 0)) {
 
 				(void) (*nfs4_ntov_map[k].sv_getit)(
-						NFS4ATTR_GETIT, sargp, na);
+				    NFS4ATTR_GETIT, sargp, na);
 			}
 			break;
 		}
@@ -2154,8 +2158,7 @@
 		for (i = 0; i < ntov.attrcnt; i++, na++, amap++) {
 			if (!(*nfs4_ntov_map[*amap].xfunc)(&xdr, na)) {
 				cmn_err(CE_WARN, "do_rfs4_op_getattr: xdr "
-					"encode of attribute %d failed\n",
-					*amap);
+				    "encode of attribute %d failed\n", *amap);
 				status = NFS4ERR_SERVERFAULT;
 				break;
 			}
@@ -2203,7 +2206,7 @@
 		status = bitmap4_get_sysattrs(&sarg);
 		if (status == NFS4_OK)
 			status = do_rfs4_op_getattr(args->attr_request,
-				&resp->obj_attributes, &sarg);
+			    &resp->obj_attributes, &sarg);
 	}
 	*cs->statusp = resp->status = status;
 }
@@ -2233,7 +2236,7 @@
 	}
 
 	resp->object.nfs_fh4_val =
-		kmem_alloc(cs->fh.nfs_fh4_len, KM_SLEEP);
+	    kmem_alloc(cs->fh.nfs_fh4_len, KM_SLEEP);
 	nfs_fh4_copy(&cs->fh, &resp->object);
 	*cs->statusp = resp->status = NFS4_OK;
 }
@@ -2403,8 +2406,7 @@
 	 * during the VOP_LINK and it didn't change during the VOP_FSYNC.
 	 */
 	if (bdva.va_seq && idva.va_seq && adva.va_seq &&
-			idva.va_seq == (bdva.va_seq + 1) &&
-			idva.va_seq == adva.va_seq)
+	    idva.va_seq == (bdva.va_seq + 1) && idva.va_seq == adva.va_seq)
 		resp->cinfo.atomic = TRUE;
 	else
 		resp->cinfo.atomic = FALSE;
@@ -2959,7 +2961,7 @@
 	}
 
 	if ((stat = rfs4_check_stateid(FREAD, vp, &args->stateid, FALSE,
-					deleg, TRUE)) != NFS4_OK) {
+	    deleg, TRUE)) != NFS4_OK) {
 		*cs->statusp = resp->status = stat;
 		goto out;
 	}
@@ -2978,7 +2980,7 @@
 
 	if (vp->v_type != VREG) {
 		*cs->statusp = resp->status =
-			((vp->v_type == VDIR) ? NFS4ERR_ISDIR : NFS4ERR_INVAL);
+		    ((vp->v_type == VDIR) ? NFS4ERR_ISDIR : NFS4ERR_INVAL);
 		goto out;
 	}
 
@@ -3035,7 +3037,7 @@
 		if (args->count > MAXBSIZE)
 			args->count = MAXBSIZE;
 		mp = allocb_wait(RNDUP(args->count), BPRI_MED,
-				STR_NOSIG, &alloc_err);
+		    STR_NOSIG, &alloc_err);
 	}
 	ASSERT(mp != NULL);
 	ASSERT(alloc_err == 0);
@@ -3167,7 +3169,7 @@
 		 * actually a mostly empty struct.
 		 */
 		exi = checkexport4(&fh_fmtp->fh4_fsid,
-			(fid_t *)&fh_fmtp->fh4_xlen, NULL);
+		    (fid_t *)&fh_fmtp->fh4_xlen, NULL);
 		cs->exi = ((exi != NULL) ? exi : exi_public);
 	} else {
 		/*
@@ -3232,7 +3234,7 @@
 
 	fh_fmtp = (nfs_fh4_fmt_t *)args->object.nfs_fh4_val;
 	cs->exi = checkexport4(&fh_fmtp->fh4_fsid, (fid_t *)&fh_fmtp->fh4_xlen,
-				NULL);
+	    NULL);
 
 	if (cs->exi == NULL) {
 		*cs->statusp = resp->status = NFS4ERR_STALE;
@@ -3559,7 +3561,7 @@
 
 	if (cp == NULL) {
 		*cs->statusp = resp->status =
-			rfs4_check_clientid(&ap->lock_owner.clientid, 0);
+		    rfs4_check_clientid(&ap->lock_owner.clientid, 0);
 		return;
 	}
 	rfs4_client_rele(cp);
@@ -3778,7 +3780,7 @@
 	 */
 	if (fp = rfs4_lookup_and_findfile(dvp, nm, &vp, &error, cs->cr)) {
 		if (rfs4_check_delegated_byfp(FWRITE, fp, TRUE, TRUE, TRUE,
-						NULL)) {
+		    NULL)) {
 			VN_RELE(vp);
 			rfs4_file_rele(fp);
 			*cs->statusp = resp->status = NFS4ERR_DELAY;
@@ -3859,12 +3861,12 @@
 			 * transmit over the wire.
 			 */
 			if ((error = VOP_RMDIR(dvp, nm, rootdir, cs->cr))
-				== EEXIST)
+			    == EEXIST)
 				error = ENOTEMPTY;
 		}
 	} else {
 		if ((error = VOP_REMOVE(dvp, nm, cs->cr)) == 0 &&
-			fp != NULL) {
+		    fp != NULL) {
 			struct vattr va;
 			vnode_t *tvp;
 
@@ -3881,7 +3883,7 @@
 				 */
 				va.va_mask = AT_NLINK;
 				if (!VOP_GETATTR(tvp, &va, 0, cs->cr) &&
-					va.va_nlink == 0) {
+				    va.va_nlink == 0) {
 					/* Remove state on file remove */
 					if (in_crit) {
 						nbl_end_crit(vp);
@@ -3940,8 +3942,7 @@
 	 * the VOP_FSYNC.
 	 */
 	if (bdva.va_seq && idva.va_seq && adva.va_seq &&
-			idva.va_seq == (bdva.va_seq + 1) &&
-			idva.va_seq == adva.va_seq)
+	    idva.va_seq == (bdva.va_seq + 1) && idva.va_seq == adva.va_seq)
 		resp->cinfo.atomic = TRUE;
 	else
 		resp->cinfo.atomic = FALSE;
@@ -4089,7 +4090,7 @@
 	 */
 	if (sfp = rfs4_lookup_and_findfile(odvp, onm, &srcvp, &error, cs->cr)) {
 		if (rfs4_check_delegated_byfp(FWRITE, sfp, TRUE, TRUE, TRUE,
-						NULL)) {
+		    NULL)) {
 			*cs->statusp = resp->status = NFS4ERR_DELAY;
 			goto err_out;
 		}
@@ -4107,7 +4108,7 @@
 	/* Does the destination exist and a file and have a delegation? */
 	if (fp = rfs4_lookup_and_findfile(ndvp, nnm, &targvp, NULL, cs->cr)) {
 		if (rfs4_check_delegated_byfp(FWRITE, fp, TRUE, TRUE, TRUE,
-						NULL)) {
+		    NULL)) {
 			*cs->statusp = resp->status = NFS4ERR_DELAY;
 			goto err_out;
 		}
@@ -4150,7 +4151,7 @@
 	NFS4_SET_FATTR4_CHANGE(resp->target_cinfo.before, nbdva.va_ctime)
 
 	if ((error = VOP_RENAME(odvp, onm, ndvp, nnm, cs->cr)) == 0 &&
-		fp != NULL) {
+	    fp != NULL) {
 		struct vattr va;
 		vnode_t *tvp;
 
@@ -4163,7 +4164,7 @@
 		if (tvp) {
 			va.va_mask = AT_NLINK;
 			if (!VOP_GETATTR(tvp, &va, 0, cs->cr) &&
-				va.va_nlink == 0) {
+			    va.va_nlink == 0) {
 				/* The file is gone and so should the state */
 				if (in_crit_targ) {
 					nbl_end_crit(targvp);
@@ -4255,15 +4256,13 @@
 	 * during the VOP_RENAME and it didn't change during the VOP_FSYNC.
 	 */
 	if (obdva.va_seq && oidva.va_seq && oadva.va_seq &&
-			oidva.va_seq == (obdva.va_seq + 1) &&
-			oidva.va_seq == oadva.va_seq)
+	    oidva.va_seq == (obdva.va_seq + 1) && oidva.va_seq == oadva.va_seq)
 		resp->source_cinfo.atomic = TRUE;
 	else
 		resp->source_cinfo.atomic = FALSE;
 
 	if (nbdva.va_seq && nidva.va_seq && nadva.va_seq &&
-			nidva.va_seq == (nbdva.va_seq + 1) &&
-			nidva.va_seq == nadva.va_seq)
+	    nidva.va_seq == (nbdva.va_seq + 1) && nidva.va_seq == nadva.va_seq)
 		resp->target_cinfo.atomic = TRUE;
 	else
 		resp->target_cinfo.atomic = FALSE;
@@ -4325,7 +4324,7 @@
 
 	if ((cp = rfs4_findclient_by_id(args->clientid, FALSE)) == NULL) {
 		*cs->statusp = resp->status =
-			rfs4_check_clientid(&args->clientid, 0);
+		    rfs4_check_clientid(&args->clientid, 0);
 		return;
 	}
 
@@ -4436,7 +4435,7 @@
 		 * on the incoming values.
 		 */
 		ret_error = VOP_GETATTR(sargp->cs->vp, sargp->vap, 0,
-				sargp->cs->cr);
+		    sargp->cs->cr);
 		if (ret_error) {
 			if (resp == NULL)
 				return (ret_error);
@@ -4493,8 +4492,7 @@
 		} else if (!(getsb && nfs4_ntov_map[k].vfsstat)) {
 			continue;
 		}
-		error = (*nfs4_ntov_map[k].sv_getit)(
-				NFS4ATTR_VERIT, sargp, na);
+		error = (*nfs4_ntov_map[k].sv_getit)(NFS4ATTR_VERIT, sargp, na);
 		if (resp != NULL) {
 			if (error)
 				ret_error = -1;	/* not all match */
@@ -4554,7 +4552,7 @@
 	} else {
 #ifdef  DEBUG
 		cmn_err(CE_NOTE, "decode_fattr4_attr: error "
-			"decoding attribute %d\n", k);
+		    "decoding attribute %d\n", k);
 #endif
 		error = EINVAL;
 	}
@@ -4633,7 +4631,7 @@
 		 * If verify/nverify, must be a readable attr.
 		 */
 		if ((error = (*nfs4_ntov_map[i].sv_getit)(
-				    NFS4ATTR_SUPPORTED, sargp, NULL)) != 0) {
+		    NFS4ATTR_SUPPORTED, sargp, NULL)) != 0) {
 			/*
 			 * Client tries to set/verify an
 			 * unsupported attribute, tries to set
@@ -4646,7 +4644,7 @@
 		 * Decode the attribute to set/verify
 		 */
 		error = decode_fattr4_attr(cmd, sargp, nfs4_ntov_map[i].nval,
-					&xdr, resp ? resp : NULL, na);
+		    &xdr, resp ? resp : NULL, na);
 		if (error)
 			break;
 		*amap++ = (uint8_t)nfs4_ntov_map[i].nval;
@@ -4657,8 +4655,8 @@
 	}
 
 	if (error != 0)
-		status = (error == ENOTSUP ?	NFS4ERR_ATTRNOTSUPP :
-						puterrno4(error));
+		status = (error == ENOTSUP ? NFS4ERR_ATTRNOTSUPP :
+		    puterrno4(error));
 	/* xdrmem_destroy(&xdrs); */	/* NO-OP */
 	return (status);
 }
@@ -4686,7 +4684,7 @@
 	sarg.sbp = &sb;
 	nfs4_ntov_table_init(&ntov);
 	status = do_rfs4_set_attrs(resp, fattrp, cs, &sarg, &ntov,
-			NFS4ATTR_SETIT);
+	    NFS4ATTR_SETIT);
 	if (status != NFS4_OK) {
 		/*
 		 * failed set attrs
@@ -4728,7 +4726,7 @@
 	if (sarg.vap->va_mask & AT_SIZE) {
 		trunc = (sarg.vap->va_size == 0);
 		status = rfs4_check_stateid(FWRITE, cs->vp, stateid,
-			trunc, &cs->deleg, sarg.vap->va_mask & AT_SIZE);
+		    trunc, &cs->deleg, sarg.vap->va_mask & AT_SIZE);
 		if (status != NFS4_OK)
 			goto done;
 	}
@@ -4806,7 +4804,7 @@
 			bf.l_sysid = 0;
 			bf.l_pid = 0;
 			error = VOP_SPACE(vp, F_FREESP, &bf, FWRITE,
-					(offset_t)sarg.vap->va_size, cr, &ct);
+			    (offset_t)sarg.vap->va_size, cr, &ct);
 		}
 	}
 
@@ -4933,8 +4931,8 @@
 	}
 
 	*cs->statusp = resp->status =
-		do_rfs4_op_setattr(&resp->attrsset, &args->obj_attributes, cs,
-			&args->stateid);
+	    do_rfs4_op_setattr(&resp->attrsset, &args->obj_attributes, cs,
+	    &args->stateid);
 }
 
 /* ARGSUSED */
@@ -4964,7 +4962,7 @@
 	sarg.sbp = &sb;
 	nfs4_ntov_table_init(&ntov);
 	resp->status = do_rfs4_set_attrs(NULL, &args->obj_attributes, cs,
-				&sarg, &ntov, NFS4ATTR_VERIT);
+	    &sarg, &ntov, NFS4ATTR_VERIT);
 	if (resp->status != NFS4_OK) {
 		/*
 		 * do_rfs4_set_attrs will try to verify systemwide attrs,
@@ -5017,7 +5015,7 @@
 	sarg.sbp = &sb;
 	nfs4_ntov_table_init(&ntov);
 	resp->status = do_rfs4_set_attrs(NULL, &args->obj_attributes, cs,
-				&sarg, &ntov, NFS4ATTR_VERIT);
+	    &sarg, &ntov, NFS4ATTR_VERIT);
 	if (resp->status != NFS4_OK) {
 		/*
 		 * do_rfs4_set_attrs will try to verify systemwide attrs,
@@ -5090,14 +5088,14 @@
 		nbl_start_crit(vp, RW_READER);
 		in_crit = 1;
 		if (nbl_conflict(vp, NBL_WRITE,
-				args->offset, args->data_len, 0)) {
+		    args->offset, args->data_len, 0)) {
 			*cs->statusp = resp->status = NFS4ERR_LOCKED;
 			goto out;
 		}
 	}
 
 	if ((stat = rfs4_check_stateid(FWRITE, vp, &args->stateid, FALSE,
-					deleg, TRUE)) != NFS4_OK) {
+	    deleg, TRUE)) != NFS4_OK) {
 		*cs->statusp = resp->status = stat;
 		goto out;
 	}
@@ -5121,7 +5119,7 @@
 
 	if (vp->v_type != VREG) {
 		*cs->statusp = resp->status =
-			((vp->v_type == VDIR) ? NFS4ERR_ISDIR : NFS4ERR_INVAL);
+		    ((vp->v_type == VDIR) ? NFS4ERR_ISDIR : NFS4ERR_INVAL);
 		goto out;
 	}
 
@@ -5254,10 +5252,10 @@
 	 * Form a reply tag by copying over the reqeuest tag.
 	 */
 	resp->tag.utf8string_val =
-				kmem_alloc(args->tag.utf8string_len, KM_SLEEP);
+	    kmem_alloc(args->tag.utf8string_len, KM_SLEEP);
 	resp->tag.utf8string_len = args->tag.utf8string_len;
 	bcopy(args->tag.utf8string_val, resp->tag.utf8string_val,
-					resp->tag.utf8string_len);
+	    resp->tag.utf8string_len);
 
 	cs.statusp = &resp->status;
 
@@ -5273,7 +5271,7 @@
 
 	resp->array_len = args->array_len;
 	resp->array = kmem_zalloc(args->array_len * sizeof (nfs_resop4),
-		KM_SLEEP);
+	    KM_SLEEP);
 
 	ASSERT(exi == NULL);
 	ASSERT(cr == NULL);
@@ -5334,11 +5332,10 @@
 			rfsproccnt_v4_ptr[op].value.ui64++;
 
 			NFS4_DEBUG(rfs4_debug > 1,
-				(CE_NOTE, "Executing %s", rfs4_op_string[op]));
+			    (CE_NOTE, "Executing %s", rfs4_op_string[op]));
 			(*rfsv4disptab[op].dis_proc)(argop, resop, req, &cs);
-			NFS4_DEBUG(rfs4_debug > 1,
-				(CE_NOTE, "%s returned %d",
-				rfs4_op_string[op], *cs.statusp));
+			NFS4_DEBUG(rfs4_debug > 1, (CE_NOTE, "%s returned %d",
+			    rfs4_op_string[op], *cs.statusp));
 			if (*cs.statusp != NFS4_OK)
 				cs.cont = FALSE;
 		} else {
@@ -5361,11 +5358,11 @@
 		 */
 		if ((i + 1) < args->array_len && !cs.cont) {
 			nfs_resop4 *new_res = kmem_alloc(
-				(i+1) * sizeof (nfs_resop4), KM_SLEEP);
+			    (i+1) * sizeof (nfs_resop4), KM_SLEEP);
 			bcopy(resp->array,
-				new_res, (i+1) * sizeof (nfs_resop4));
+			    new_res, (i+1) * sizeof (nfs_resop4));
 			kmem_free(resp->array,
-				args->array_len * sizeof (nfs_resop4));
+			    args->array_len * sizeof (nfs_resop4));
 
 			resp->array_len =  i + 1;
 			resp->array = new_res;
@@ -5463,7 +5460,7 @@
 		e = NFS4_OK;
 
 		NFS4_DEBUG(rfs4_debug, (CE_NOTE,
-			"rfs4_client_sysid: allocated 0x%x\n", *sp));
+		    "rfs4_client_sysid: allocated 0x%x\n", *sp));
 	} else
 		e = NFS4ERR_DELAY;
 
@@ -5497,10 +5494,8 @@
 
 	ASSERT(flk->l_whence == 0);
 	cmn_err(CE_NOTE, "%s:  %s, type = %s, off = %llx len = %llx pid = %d",
-		str, op, type,
-		(longlong_t)flk->l_start,
-		flk->l_len ? (longlong_t)flk->l_len : ~0LL,
-		flk->l_pid);
+	    str, op, type, (longlong_t)flk->l_start,
+	    flk->l_len ? (longlong_t)flk->l_len : ~0LL, flk->l_pid);
 }
 
 #define	LOCK_PRINT(d, s, t, f) if (d) lock_print(s, t, f)
@@ -5848,8 +5843,8 @@
 
 		*attrset = 0;
 		status = do_rfs4_set_attrs(attrset,
-					&args->createhow4_u.createattrs,
-					cs, &sarg, &ntov, NFS4ATTR_SETIT);
+		    &args->createhow4_u.createattrs,
+		    cs, &sarg, &ntov, NFS4ATTR_SETIT);
 
 		if (status == NFS4_OK && (sarg.vap->va_mask & AT_TYPE) &&
 		    sarg.vap->va_type != VREG) {
@@ -5916,7 +5911,7 @@
 	}
 
 	status = create_vnode(dvp, nm, vap, args->mode, mtime,
-						cs->cr, &vp, &created);
+	    cs->cr, &vp, &created);
 	kmem_free(nm, buflen);
 
 	if (status != NFS4_OK) {
@@ -5987,7 +5982,7 @@
 	 */
 	if (!created) {
 		if (bva.va_seq && iva.va_seq &&
-			bva.va_seq == iva.va_seq)
+		    bva.va_seq == iva.va_seq)
 			cinfo->atomic = TRUE;
 		else
 			cinfo->atomic = FALSE;
@@ -6018,8 +6013,7 @@
 		 * change during the VOP_FSYNC.
 		 */
 		if (bva.va_seq && iva.va_seq && ava.va_seq &&
-				iva.va_seq == (bva.va_seq + 1) &&
-				iva.va_seq == ava.va_seq)
+		    iva.va_seq == (bva.va_seq + 1) && iva.va_seq == ava.va_seq)
 			cinfo->atomic = TRUE;
 		else
 			cinfo->atomic = FALSE;
@@ -6053,9 +6047,7 @@
 			rfs4_hold_deleg_policy();
 			if ((fp = rfs4_findfile(vp, NULL, &create)) != NULL) {
 				if (rfs4_check_delegated_byfp(FWRITE, fp,
-					(reqsize == 0), FALSE, FALSE,
-							&clientid)) {
-
+				    (reqsize == 0), FALSE, FALSE, &clientid)) {
 					rfs4_file_rele(fp);
 					rfs4_rele_deleg_policy();
 					VN_RELE(vp);
@@ -6073,7 +6065,7 @@
 
 				nbl_start_crit(vp, RW_READER);
 				if (nbl_conflict(vp, NBL_WRITE, 0,
-						cva.va_size, 0)) {
+				    cva.va_size, 0)) {
 					in_crit = 0;
 					nbl_end_crit(vp);
 					VN_RELE(vp);
@@ -6157,7 +6149,7 @@
 	file = rfs4_findfile_withlock(cs->vp, &cs->fh, &fcreate);
 	if (file == NULL) {
 		NFS4_DEBUG(rfs4_debug,
-			(CE_NOTE, "rfs4_do_open: can't find file"));
+		    (CE_NOTE, "rfs4_do_open: can't find file"));
 		resp->status = NFS4ERR_SERVERFAULT;
 		return;
 	}
@@ -6165,7 +6157,7 @@
 	state = rfs4_findstate_by_owner_file(oo, file, &screate);
 	if (state == NULL) {
 		NFS4_DEBUG(rfs4_debug,
-			(CE_NOTE, "rfs4_do_open: can't find state"));
+		    (CE_NOTE, "rfs4_do_open: can't find state"));
 		resp->status = NFS4ERR_RESOURCE;
 		/* No need to keep any reference */
 		rfs4_file_rele_withunlock(file);
@@ -6220,7 +6212,7 @@
 		if ((err = vop_shrlock(cs->vp, F_SHARE, &shr, fflags)) != 0) {
 
 			resp->status = err == EAGAIN ?
-				NFS4ERR_SHARE_DENIED : puterrno4(err);
+			    NFS4ERR_SHARE_DENIED : puterrno4(err);
 
 			rfs4_file_rele(file);
 			/* Not a fully formed open; "close" it */
@@ -6320,7 +6312,7 @@
 
 	if (args->opentype == OPEN4_NOCREATE)
 		resp->status = rfs4_lookupfile(&args->open_claim4_u.file,
-					req, cs, args->share_access, cinfo);
+		    req, cs, args->share_access, cinfo);
 	else {
 		/* inhibit delegation grants during exclusive create */
 
@@ -6328,7 +6320,7 @@
 			rfs4_disable_delegation();
 
 		resp->status = rfs4_createfile(args, req, cs, cinfo, attrset,
-					oo->client->clientid);
+		    oo->client->clientid);
 	}
 
 	if (resp->status == NFS4_OK) {
@@ -6336,7 +6328,7 @@
 		/* cs->vp cs->fh now reference the desired file */
 
 		rfs4_do_open(cs, req, oo, DELEG_ANY, args->share_access,
-						args->share_deny, resp);
+		    args->share_deny, resp);
 
 		/*
 		 * If rfs4_createfile set attrset, we must
@@ -6405,8 +6397,8 @@
 	cinfo->atomic = FALSE;
 
 	rfs4_do_open(cs, req, oo,
-		NFS4_DELEG4TYPE2REQTYPE(args->open_claim4_u.delegate_type),
-		args->share_access, args->share_deny, resp);
+	    NFS4_DELEG4TYPE2REQTYPE(args->open_claim4_u.delegate_type),
+	    args->share_access, args->share_deny, resp);
 }
 
 static void
@@ -6416,7 +6408,7 @@
 	int error;
 	nfsstat4 status;
 	stateid4 stateid =
-			args->open_claim4_u.delegate_cur_info.delegate_stateid;
+	    args->open_claim4_u.delegate_cur_info.delegate_stateid;
 	rfs4_deleg_state_t *dsp;
 
 	/*
@@ -6460,7 +6452,7 @@
 	dsp->finfo->dinfo->time_lastwrite = gethrestime_sec();
 	rfs4_deleg_state_rele(dsp);
 	rfs4_do_open(cs, req, oo, DELEG_NONE,
-				args->share_access, args->share_deny, resp);
+	    args->share_access, args->share_deny, resp);
 }
 
 /*ARGSUSED*/
@@ -6488,7 +6480,7 @@
 
 	/* Note we ignore oflags */
 	resp->status = rfs4_lookupfile(&args->open_claim4_u.file_delegate_prev,
-				req, cs, args->share_access, &resp->cinfo);
+	    req, cs, args->share_access, &resp->cinfo);
 
 	if (resp->status != NFS4_OK) {
 		return;
@@ -6498,7 +6490,7 @@
 	file = rfs4_findfile_withlock(cs->vp, NULL, &create);
 	if (file == NULL) {
 		NFS4_DEBUG(rfs4_debug,
-			(CE_NOTE, "rfs4_do_opendelprev: can't find file"));
+		    (CE_NOTE, "rfs4_do_opendelprev: can't find file"));
 		resp->status = NFS4ERR_SERVERFAULT;
 		return;
 	}
@@ -6506,7 +6498,7 @@
 	state = rfs4_findstate_by_owner_file(oo, file, &create);
 	if (state == NULL) {
 		NFS4_DEBUG(rfs4_debug,
-			(CE_NOTE, "rfs4_do_opendelprev: can't find state"));
+		    (CE_NOTE, "rfs4_do_opendelprev: can't find state"));
 		resp->status = NFS4ERR_SERVERFAULT;
 		rfs4_file_rele_withunlock(file);
 		return;
@@ -6515,10 +6507,10 @@
 	rfs4_dbe_lock(state->dbe);
 	rfs4_dbe_lock(file->dbe);
 	if (args->share_access != state->share_access ||
-			args->share_deny != state->share_deny ||
-			state->finfo->dinfo->dtype == OPEN_DELEGATE_NONE) {
+	    args->share_deny != state->share_deny ||
+	    state->finfo->dinfo->dtype == OPEN_DELEGATE_NONE) {
 		NFS4_DEBUG(rfs4_debug,
-			(CE_NOTE, "rfs4_do_opendelprev: state mixup"));
+		    (CE_NOTE, "rfs4_do_opendelprev: state mixup"));
 		rfs4_dbe_unlock(file->dbe);
 		rfs4_dbe_unlock(state->dbe);
 		rfs4_file_rele(file);
@@ -6545,14 +6537,14 @@
 
 	if (dsp->dtype == OPEN_DELEGATE_READ) {
 		open_read_delegation4 *rv =
-			&resp->delegation.open_delegation4_u.read;
+		    &resp->delegation.open_delegation4_u.read;
 
 		rv->stateid = dsp->delegid.stateid;
 		rv->recall = FALSE; /* no policy in place to set to TRUE */
 		ace = &rv->permissions;
 	} else {
 		open_write_delegation4 *rv =
-			&resp->delegation.open_delegation4_u.write;
+		    &resp->delegation.open_delegation4_u.write;
 
 		rv->stateid = dsp->delegid.stateid;
 		rv->recall = FALSE;  /* no policy in place to set to TRUE */
@@ -6593,7 +6585,7 @@
 			rfs4_copy_reply(resop, lastop);
 		}
 		NFS4_DEBUG(rfs4_debug, (CE_NOTE,
-			"Replayed SEQID %d\n", seqid));
+		    "Replayed SEQID %d\n", seqid));
 		return (NFS4_CHKSEQ_REPLAY);
 	}
 
@@ -6601,14 +6593,14 @@
 	if (rqst_seq != seqid + 1) {
 		if (rqst_seq == seqid) {
 			NFS4_DEBUG(rfs4_debug,
-				(CE_NOTE, "BAD SEQID: Replayed sequence id "
-				"but last op was %d current op is %d\n",
-				lastop->resop, resop->resop));
+			    (CE_NOTE, "BAD SEQID: Replayed sequence id "
+			    "but last op was %d current op is %d\n",
+			    lastop->resop, resop->resop));
 			return (NFS4_CHKSEQ_BAD);
 		}
 		NFS4_DEBUG(rfs4_debug,
-			(CE_NOTE, "BAD SEQID: got %u expecting %u\n",
-				rqst_seq, seqid));
+		    (CE_NOTE, "BAD SEQID: got %u expecting %u\n",
+		    rqst_seq, seqid));
 		return (NFS4_CHKSEQ_BAD);
 	}
 
@@ -6640,7 +6632,7 @@
 
 	rfs4_dbe_lock(op->dbe);
 	rc = rfs4_check_seqid(op->open_seqid, op->reply,
-		olo_seqid, resop, FALSE);
+	    olo_seqid, resop, FALSE);
 	rfs4_dbe_unlock(op->dbe);
 
 	return (rc);
@@ -6653,8 +6645,7 @@
 
 	rfs4_dbe_lock(lp->dbe);
 	if (!lp->skip_seqid_check)
-		rc = rfs4_check_seqid(lp->seqid, lp->reply,
-			seqid, resop, TRUE);
+		rc = rfs4_check_seqid(lp->seqid, lp->reply, seqid, resop, TRUE);
 	rfs4_dbe_unlock(lp->dbe);
 
 	return (rc);
@@ -6687,7 +6678,7 @@
 	cp = rfs4_findclient_by_id(owner->clientid, FALSE);
 	if (cp == NULL) {
 		*cs->statusp = resp->status =
-			rfs4_check_clientid(&owner->clientid, 0);
+		    rfs4_check_clientid(&owner->clientid, 0);
 		return;
 	}
 
@@ -6723,7 +6714,7 @@
 		switch (rfs4_check_open_seqid(args->seqid, oo, resop)) {
 		case NFS4_CHKSEQ_BAD:
 			if ((args->seqid > oo->open_seqid) &&
-				oo->need_confirm) {
+			    oo->need_confirm) {
 				rfs4_free_opens(oo, TRUE, FALSE);
 				rfs4_sw_exit(&oo->oo_sw);
 				rfs4_openowner_rele(oo);
@@ -6820,16 +6811,16 @@
 	switch (claim) {
 	case CLAIM_NULL:
 		rfs4_do_opennull(cs, req, args, oo, resp);
-	    break;
+		break;
 	case CLAIM_PREVIOUS:
 		rfs4_do_openprev(cs, req, args, oo, resp);
-	    break;
+		break;
 	case CLAIM_DELEGATE_CUR:
 		rfs4_do_opendelcur(cs, req, args, oo, resp);
-	    break;
+		break;
 	case CLAIM_DELEGATE_PREV:
 		rfs4_do_opendelprev(cs, req, args, oo, resp);
-	    break;
+		break;
 	default:
 		resp->status = NFS4ERR_INVAL;
 		break;
@@ -6877,10 +6868,10 @@
 			 * it.
 			 */
 			nfs_fh4_fmt_t *fh_fmtp =
-				(nfs_fh4_fmt_t *)oo->reply_fh.nfs_fh4_val;
+			    (nfs_fh4_fmt_t *)oo->reply_fh.nfs_fh4_val;
 
 			cs->exi = checkexport4(&fh_fmtp->fh4_fsid,
-				(fid_t *)&fh_fmtp->fh4_xlen, NULL);
+			    (fid_t *)&fh_fmtp->fh4_xlen, NULL);
 
 			if (cs->exi == NULL) {
 				resp->status = NFS4ERR_STALE;
@@ -6890,7 +6881,7 @@
 			VN_RELE(cs->vp);
 
 			cs->vp = nfs4_fhtovp(&oo->reply_fh, cs->exi,
-				&resp->status);
+			    &resp->status);
 
 			if (cs->vp == NULL)
 				goto finish;
@@ -6971,7 +6962,7 @@
 	switch (rfs4_check_stateid_seqid(sp, &args->open_stateid)) {
 	case NFS4_CHECK_STATEID_OKAY:
 		if (rfs4_check_open_seqid(args->seqid, sp->owner,
-			resop) != 0) {
+		    resop) != 0) {
 			*cs->statusp = resp->status = NFS4ERR_BAD_SEQID;
 			break;
 		}
@@ -7018,7 +7009,7 @@
 		break;
 	case NFS4_CHECK_STATEID_UNCONFIRMED:
 		if (rfs4_check_open_seqid(args->seqid, sp->owner,
-			resop) != NFS4_CHKSEQ_OKAY) {
+		    resop) != NFS4_CHKSEQ_OKAY) {
 			*cs->statusp = resp->status = NFS4ERR_BAD_SEQID;
 			break;
 		}
@@ -7077,7 +7068,7 @@
 	switch (rfs4_check_stateid_seqid(sp, &args->open_stateid)) {
 	case NFS4_CHECK_STATEID_OKAY:
 		if (rfs4_check_open_seqid(args->seqid, sp->owner,
-			resop) != NFS4_CHKSEQ_OKAY) {
+		    resop) != NFS4_CHKSEQ_OKAY) {
 			*cs->statusp = resp->status = NFS4ERR_BAD_SEQID;
 			goto end;
 		}
@@ -7304,7 +7295,7 @@
 		*cs->statusp = res->status = NFS4_OK;
 		res->SETCLIENTID4res_u.resok4.clientid = cp->clientid;
 		res->SETCLIENTID4res_u.resok4.setclientid_confirm =
-							cp->confirm_verf;
+		    cp->confirm_verf;
 		/* Setup callback information; CB_NULL confirmation later */
 		rfs4_client_setcb(cp, &args->callback, args->callback_ident);
 
@@ -7371,20 +7362,20 @@
 		 * be an update of the callback info
 		 */
 		if (cp_confirmed->nfs_client.verifier ==
-						args->client.verifier) {
+		    args->client.verifier) {
 			/* Setup callback information */
 			rfs4_client_setcb(cp_confirmed, &args->callback,
-						args->callback_ident);
+			    args->callback_ident);
 
 			/* everything okay -- move ahead */
 			*cs->statusp = res->status = NFS4_OK;
 			res->SETCLIENTID4res_u.resok4.clientid =
-				cp_confirmed->clientid;
+			    cp_confirmed->clientid;
 
 			/* update the confirm_verifier and return it */
 			rfs4_client_scv_next(cp_confirmed);
 			res->SETCLIENTID4res_u.resok4.setclientid_confirm =
-						cp_confirmed->confirm_verf;
+			    cp_confirmed->confirm_verf;
 
 			rfs4_client_rele(cp_confirmed);
 			return;
@@ -7397,7 +7388,7 @@
 		 */
 		create = FALSE;
 		cp_unconfirmed = rfs4_findclient(&args->client, &create,
-						cp_confirmed);
+		    cp_confirmed);
 	}
 
 	/*
@@ -7456,11 +7447,9 @@
 
 	*cs->statusp = res->status = NFS4_OK;
 	res->SETCLIENTID4res_u.resok4.clientid = newcp->clientid;
-	res->SETCLIENTID4res_u.resok4.setclientid_confirm =
-							newcp->confirm_verf;
+	res->SETCLIENTID4res_u.resok4.setclientid_confirm = newcp->confirm_verf;
 	/* Setup callback information; CB_NULL confirmation later */
-	rfs4_client_setcb(newcp, &args->callback,
-				args->callback_ident);
+	rfs4_client_setcb(newcp, &args->callback, args->callback_ident);
 
 	newcp->cp_confirmed = cp_confirmed;
 
@@ -7473,9 +7462,9 @@
 			    struct svc_req *req, struct compound_state *cs)
 {
 	SETCLIENTID_CONFIRM4args *args =
-		&argop->nfs_argop4_u.opsetclientid_confirm;
+	    &argop->nfs_argop4_u.opsetclientid_confirm;
 	SETCLIENTID_CONFIRM4res *res =
-		&resop->nfs_resop4_u.opsetclientid_confirm;
+	    &resop->nfs_resop4_u.opsetclientid_confirm;
 	rfs4_client_t *cp, *cptoclose = NULL;
 
 	*cs->statusp = res->status = NFS4_OK;
@@ -7484,7 +7473,7 @@
 
 	if (cp == NULL) {
 		*cs->statusp = res->status =
-			rfs4_check_clientid(&args->clientid, 1);
+		    rfs4_check_clientid(&args->clientid, 1);
 		return;
 	}
 
@@ -7576,7 +7565,7 @@
 	switch (rfs4_check_stateid_seqid(sp, &args->open_stateid)) {
 	case NFS4_CHECK_STATEID_OKAY:
 		if (rfs4_check_open_seqid(args->seqid, sp->owner,
-			resop) != NFS4_CHKSEQ_OKAY) {
+		    resop) != NFS4_CHKSEQ_OKAY) {
 			*cs->statusp = resp->status = NFS4ERR_BAD_SEQID;
 			goto end;
 		}
@@ -7701,7 +7690,7 @@
 	if (close_of_client) {
 		if (sp->owner->client->unlksys_completed == FALSE &&
 		    sp->lockownerlist.next->lsp != NULL &&
-			sp->owner->client->sysidt != LM_NOSYSID) {
+		    sp->owner->client->sysidt != LM_NOSYSID) {
 			/* Is the PxFS kernel module loaded? */
 			if (lm_remove_file_locks != NULL) {
 				int new_sysid;
@@ -7742,7 +7731,7 @@
 	 * least mark the locks as having been released
 	 */
 	for (lsp = sp->lockownerlist.next->lsp; lsp != NULL;
-		lsp = lsp->lockownerlist.next->lsp) {
+	    lsp = lsp->lockownerlist.next->lsp) {
 
 		lsp->locks_cleaned = TRUE;
 
@@ -7750,7 +7739,7 @@
 		if (!close_of_client &&
 		    sp->owner->client->sysidt != LM_NOSYSID)
 			(void) cleanlocks(sp->finfo->vp, lsp->locker->pid,
-				lsp->locker->client->sysidt);
+			    lsp->locker->client->sysidt);
 	}
 
 	/*
@@ -7837,7 +7826,7 @@
 	for (i = 0; i < rfs4_maxlock_tries; i++) {
 		LOCK_PRINT(rfs4_debug, "setlock", F_SETLK, flock);
 		error = VOP_FRLOCK(vp, F_SETLK,
-				flock, flag, (u_offset_t)0, NULL, cred);
+		    flock, flag, (u_offset_t)0, NULL, cred);
 
 		if (error != EAGAIN && error != EACCES)
 			break;
@@ -7853,14 +7842,14 @@
 		flk = *flock;
 		LOCK_PRINT(rfs4_debug, "setlock", F_GETLK, &flk);
 		if (VOP_FRLOCK(vp, F_GETLK,
-			    &flk,  flag, (u_offset_t)0, NULL, cred) == 0) {
+		    &flk,  flag, (u_offset_t)0, NULL, cred) == 0) {
 			if (flk.l_type == F_UNLCK) {
 				/* No longer locked, retry */
 				goto retry;
 			}
 			*flock = flk;
 			LOCK_PRINT(rfs4_debug, "setlock(blocking lock)",
-				F_GETLK, &flk);
+			    F_GETLK, &flk);
 		}
 	}
 
@@ -7969,7 +7958,7 @@
 		lres = &resop->nfs_resop4_u.oplock;
 		status = NFS4ERR_DENIED;
 		if (lock_denied(&lres->LOCK4res_u.denied, &flock)
-			== NFS4ERR_EXPIRED)
+		    == NFS4ERR_EXPIRED)
 			goto retry;
 		break;
 	case ENOLCK:
@@ -7982,8 +7971,7 @@
 		status = NFS4ERR_NOTSUPP;
 		break;
 	default:
-		cmn_err(CE_WARN, "rfs4_do_lock: unexpected errno (%d)",
-			error);
+		cmn_err(CE_WARN, "rfs4_do_lock: unexpected errno (%d)", error);
 		status = NFS4ERR_SERVERFAULT;
 		break;
 	}
@@ -8026,8 +8014,7 @@
 		status = rfs4_get_state(stateid, &sp, RFS4_DBS_VALID);
 		if (status != NFS4_OK) {
 			NFS4_DEBUG(rfs4_debug,
-				(CE_NOTE, "Get state failed in lock %d",
-				status));
+			    (CE_NOTE, "Get state failed in lock %d", status));
 			*cs->statusp = resp->status = status;
 			return;
 		}
@@ -8061,7 +8048,7 @@
 		case NFS4_CHECK_STATEID_OKAY:
 		case NFS4_CHECK_STATEID_REPLAY:
 			switch (rfs4_check_olo_seqid(olo->open_seqid,
-				sp->owner, resop)) {
+			    sp->owner, resop)) {
 			case NFS4_CHKSEQ_OKAY:
 				if (rc == NFS4_CHECK_STATEID_OKAY)
 					break;
@@ -8072,8 +8059,7 @@
 				 */
 				/* FALLTHROUGH */
 			case NFS4_CHKSEQ_BAD:
-				*cs->statusp = resp->status =
-					NFS4ERR_BAD_SEQID;
+				*cs->statusp = resp->status = NFS4ERR_BAD_SEQID;
 				goto end;
 			case NFS4_CHKSEQ_REPLAY:
 				/* This is a duplicate LOCK request */
@@ -8093,7 +8079,7 @@
 		lo = rfs4_findlockowner(&olo->lock_owner, &lcreate);
 		if (lo == NULL) {
 			NFS4_DEBUG(rfs4_debug,
-				(CE_NOTE, "rfs4_op_lock: no lock owner"));
+			    (CE_NOTE, "rfs4_op_lock: no lock owner"));
 			*cs->statusp = resp->status = NFS4ERR_RESOURCE;
 			goto end;
 		}
@@ -8110,7 +8096,7 @@
 			}
 
 			NFS4_DEBUG(rfs4_debug,
-				(CE_NOTE, "rfs4_op_lock: no state"));
+			    (CE_NOTE, "rfs4_op_lock: no state"));
 			*cs->statusp = resp->status = NFS4ERR_SERVERFAULT;
 			rfs4_update_open_resp(sp->owner, resop, NULL);
 			rfs4_lockowner_rele(lo);
@@ -8130,7 +8116,7 @@
 		if (dup_lock == FALSE && create == FALSE) {
 			if (lsp->lock_completed == TRUE) {
 				*cs->statusp =
-					resp->status = NFS4ERR_BAD_SEQID;
+				    resp->status = NFS4ERR_BAD_SEQID;
 				rfs4_lockowner_rele(lo);
 				goto end;
 			}
@@ -8154,9 +8140,9 @@
 			/* verify that lock_seqid's match */
 			if (lsp->seqid != olo->lock_seqid) {
 				NFS4_DEBUG(rfs4_debug,
-				(CE_NOTE, "rfs4_op_lock: Dup-Lock seqid bad"
-				"lsp->seqid=%d old->seqid=%d",
-				lsp->seqid, olo->lock_seqid));
+				    (CE_NOTE, "rfs4_op_lock: Dup-Lock seqid bad"
+				    "lsp->seqid=%d old->seqid=%d",
+				    lsp->seqid, olo->lock_seqid));
 				*cs->statusp = resp->status = NFS4ERR_BAD_SEQID;
 			} else {
 				rfs4_copy_reply(resop, lsp->reply);
@@ -8177,7 +8163,7 @@
 		lsp->seqid = olo->lock_seqid;
 
 		NFS4_DEBUG(rfs4_debug,
-			(CE_NOTE, "Lock seqid established as %d", lsp->seqid));
+		    (CE_NOTE, "Lock seqid established as %d", lsp->seqid));
 
 		/*
 		 * This is used to signify the newly created lockowner
@@ -8240,8 +8226,8 @@
 			 * replay but it is okay.
 			 */
 			switch (rfs4_check_lock_seqid(
-				args->locker.locker4_u.lock_owner.lock_seqid,
-				lsp, resop)) {
+			    args->locker.locker4_u.lock_owner.lock_seqid,
+			    lsp, resop)) {
 			case NFS4_CHKSEQ_REPLAY:
 				if (resp->status != NFS4_OK) {
 					/*
@@ -8260,8 +8246,7 @@
 				 */
 				/*FALLTHROUGH*/
 			case NFS4_CHKSEQ_BAD:
-				*cs->statusp = resp->status =
-					NFS4ERR_BAD_SEQID;
+				*cs->statusp = resp->status = NFS4ERR_BAD_SEQID;
 				goto end;
 			case NFS4_CHKSEQ_OKAY:
 				/* Everything looks okay move ahead */
@@ -8282,8 +8267,8 @@
 			goto end;
 		case NFS4_CHECK_STATEID_REPLAY:
 			switch (rfs4_check_lock_seqid(
-				args->locker.locker4_u.lock_owner.lock_seqid,
-				lsp, resop)) {
+			    args->locker.locker4_u.lock_owner.lock_seqid,
+			    lsp, resop)) {
 			case NFS4_CHKSEQ_OKAY:
 				/*
 				 * This is a replayed stateid; if
@@ -8291,8 +8276,7 @@
 				 * then client is using wrong seqid.
 				 */
 			case NFS4_CHKSEQ_BAD:
-				*cs->statusp = resp->status =
-					NFS4ERR_BAD_SEQID;
+				*cs->statusp = resp->status = NFS4ERR_BAD_SEQID;
 				goto end;
 			case NFS4_CHKSEQ_REPLAY:
 				rfs4_update_lease(lsp->locker->client);
@@ -8342,9 +8326,8 @@
 		cs->deleg = TRUE;
 
 	status = rfs4_do_lock(lsp, args->locktype,
-				args->locker.locker4_u.lock_owner.lock_seqid,
-				args->offset,
-				args->length, cs->cr, resop);
+	    args->locker.locker4_u.lock_owner.lock_seqid,
+	    args->offset, args->length, cs->cr, resop);
 
 out:
 	lsp->skip_seqid_check = FALSE;
@@ -8467,8 +8450,7 @@
 				 * then client is using wrong seqid.
 				 */
 		case NFS4_CHKSEQ_BAD:
-			*cs->statusp = resp->status =
-				NFS4ERR_BAD_SEQID;
+			*cs->statusp = resp->status = NFS4ERR_BAD_SEQID;
 			goto end;
 		case NFS4_CHKSEQ_REPLAY:
 			rfs4_update_lease(lsp->locker->client);
@@ -8502,8 +8484,7 @@
 	}
 
 	status = rfs4_do_lock(lsp, args->locktype,
-			    args->seqid, args->offset,
-			    args->length, cs->cr, resop);
+	    args->seqid, args->offset, args->length, cs->cr, resop);
 
 out:
 	*cs->statusp = resp->status = status;
@@ -8566,7 +8547,7 @@
 	if ((cp = rfs4_findclient_by_id(args->owner.clientid, FALSE))
 	    == NULL) {
 		*cs->statusp = resp->status =
-			rfs4_check_clientid(&args->owner.clientid, 0);
+		    rfs4_check_clientid(&args->owner.clientid, 0);
 		return;
 	}
 	if (rfs4_lease_expired(cp)) {
@@ -8614,7 +8595,7 @@
 	if (lo) {
 		pid = lo->pid;
 		if ((resp->status =
-			rfs4_client_sysid(lo->client, &sysid)) != NFS4_OK)
+		    rfs4_client_sysid(lo->client, &sysid)) != NFS4_OK)
 		goto out;
 	} else {
 		pid = 0;
@@ -8661,7 +8642,7 @@
 		break;
 	default:
 		cmn_err(CE_WARN, "rfs4_op_lockt: unexpected errno (%d)",
-			error);
+		    error);
 		resp->status = NFS4ERR_SERVERFAULT;
 		break;
 	}
@@ -8683,10 +8664,10 @@
 	err = VOP_SHRLOCK(vp, cmd, sp, fflags, CRED());
 
 	NFS4_DEBUG(rfs4_shrlock_debug,
-		(CE_NOTE, "rfs4_shrlock %s vp=%p acc=%d dny=%d sysid=%d "
-		"pid=%d err=%d\n", cmd == F_SHARE ? "SHARE" : "UNSHR",
-		(void *) vp, sp->s_access, sp->s_deny, sp->s_sysid, sp->s_pid,
-		err));
+	    (CE_NOTE, "rfs4_shrlock %s vp=%p acc=%d dny=%d sysid=%d "
+	    "pid=%d err=%d\n", cmd == F_SHARE ? "SHARE" : "UNSHR",
+	    (void *) vp, sp->s_access, sp->s_deny, sp->s_sysid, sp->s_pid,
+	    err));
 
 	return (err);
 }
--- a/usr/src/uts/common/fs/nfs/nfs4_state.c	Fri Sep 14 10:25:36 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs4_state.c	Fri Sep 14 11:24:08 2007 -0700
@@ -43,6 +43,7 @@
 
 
 extern time_t rfs4_start_time;
+extern uint_t nfs4_srv_vkey;
 
 stateid4 special0 = {
 	0,
@@ -2198,7 +2199,12 @@
 		    fp->filehandle.nfs_fh4_len);
 	cv_destroy(fp->dinfo->recall_cv);
 	if (fp->vp) {
-		VN_RELE(fp->vp);
+		vnode_t *vp = fp->vp;
+
+		mutex_enter(&vp->v_lock);
+		(void) vsd_set(vp, nfs4_srv_vkey, NULL);
+		mutex_exit(&vp->v_lock);
+		VN_RELE(vp);
 		fp->vp = NULL;
 	}
 	rw_destroy(&fp->file_rwlock);
@@ -2264,6 +2270,13 @@
 
 	rw_init(&fp->file_rwlock, NULL, RW_DEFAULT, NULL);
 
+	mutex_enter(&vp->v_lock);
+	if (vsd_set(vp, nfs4_srv_vkey, (void *)fp)) {
+		ASSERT(FALSE);
+		cmn_err(CE_WARN, "rfs4_file_create: vsd_set failed.");
+	}
+	mutex_exit(&vp->v_lock);
+
 	return (TRUE);
 }
 
@@ -2276,8 +2289,24 @@
 	arg.vp = vp;
 	arg.fh = fh;
 
-	fp = (rfs4_file_t *)rfs4_dbsearch(rfs4_file_idx, vp, create,
-	    &arg, RFS4_DBS_VALID);
+	if (*create == TRUE)
+		fp = (rfs4_file_t *)rfs4_dbsearch(rfs4_file_idx, vp, create,
+		    &arg, RFS4_DBS_VALID);
+	else {
+		mutex_enter(&vp->v_lock);
+		fp = (rfs4_file_t *)vsd_get(vp, nfs4_srv_vkey);
+		mutex_exit(&vp->v_lock);
+		if (fp) {
+			rfs4_dbe_lock(fp->dbe);
+			if (rfs4_dbe_is_invalid(fp->dbe)) {
+				rfs4_dbe_unlock(fp->dbe);
+				fp = NULL;
+			} else {
+				rfs4_dbe_hold(fp->dbe);
+				rfs4_dbe_unlock(fp->dbe);
+			}
+		}
+	}
 	return (fp);
 }
 
@@ -2296,19 +2325,36 @@
 	rfs4_fcreate_arg arg;
 	bool_t screate = *create;
 
+	if (screate == FALSE) {
+		mutex_enter(&vp->v_lock);
+		fp = (rfs4_file_t *)vsd_get(vp, nfs4_srv_vkey);
+		mutex_exit(&vp->v_lock);
+		if (fp) {
+			rfs4_dbe_lock(fp->dbe);
+			if (rfs4_dbe_is_invalid(fp->dbe)) {
+				rfs4_dbe_unlock(fp->dbe);
+				fp = NULL;
+			} else {
+				rfs4_dbe_hold(fp->dbe);
+				rfs4_dbe_unlock(fp->dbe);
+				rw_enter(&fp->file_rwlock, RW_WRITER);
+			}
+		}
+	} else {
 retry:
-	arg.vp = vp;
-	arg.fh = fh;
-
-	fp = (rfs4_file_t *)rfs4_dbsearch(rfs4_file_idx, vp, create,
-	    &arg, RFS4_DBS_VALID);
-	if (fp != NULL) {
-		rw_enter(&fp->file_rwlock, RW_WRITER);
-		if (fp->vp == NULL) {
-			rw_exit(&fp->file_rwlock);
-			rfs4_file_rele(fp);
-			*create = screate;
-			goto retry;
+		arg.vp = vp;
+		arg.fh = fh;
+
+		fp = (rfs4_file_t *)rfs4_dbsearch(rfs4_file_idx, vp, create,
+		    &arg, RFS4_DBS_VALID);
+		if (fp != NULL) {
+			rw_enter(&fp->file_rwlock, RW_WRITER);
+			if (fp->vp == NULL) {
+				rw_exit(&fp->file_rwlock);
+				rfs4_file_rele(fp);
+				*create = screate;
+				goto retry;
+			}
 		}
 	}
 
@@ -3642,7 +3688,12 @@
 	 */
 	rfs4_dbe_lock(fp->dbe);
 	if (fp->vp) {
-		VN_RELE(fp->vp);
+		vnode_t *vp = fp->vp;
+
+		mutex_enter(&vp->v_lock);
+		(void) vsd_set(vp, nfs4_srv_vkey, NULL);
+		mutex_exit(&vp->v_lock);
+		VN_RELE(vp);
 		fp->vp = NULL;
 	}
 	rfs4_dbe_unlock(fp->dbe);
--- a/usr/src/uts/common/fs/nfs/nfs_srv.c	Fri Sep 14 10:25:36 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs_srv.c	Fri Sep 14 11:24:08 2007 -0700
@@ -100,14 +100,13 @@
 	vnode_t *vp;
 	struct vattr va;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_GETATTR_START,
-		"rfs_getattr_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_GETATTR_START, "rfs_getattr_start:");
 
 	vp = nfs_fhtovp(fhp, exi);
 	if (vp == NULL) {
 		ns->ns_status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_GETATTR_END,
-			"rfs_getattr_end:(%S)", "stale");
+		    "rfs_getattr_end:(%S)", "stale");
 		return;
 	}
 
@@ -115,11 +114,9 @@
 	 * Do the getattr.
 	 */
 	va.va_mask = AT_ALL;	/* we want all the attributes */
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-		"vop_getattr_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 	error = rfs4_delegated_getattr(vp, &va, 0, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-		"vop_getattr_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 
 	/* check for overflows */
 	if (!error) {
@@ -131,8 +128,7 @@
 
 	ns->ns_status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_GETATTR_END,
-		"rfs_getattr_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_GETATTR_END, "rfs_getattr_end:(%S)", "done");
 }
 void *
 rfs_getattr_getfh(fhandle_t *fhp)
@@ -157,14 +153,13 @@
 	struct vattr bva;
 	struct flock64 bf;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_SETATTR_START,
-		"rfs_setattr_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_SETATTR_START, "rfs_setattr_start:");
 
 	vp = nfs_fhtovp(&args->saa_fh, exi);
 	if (vp == NULL) {
 		ns->ns_status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_SETATTR_END,
-			"rfs_setattr_end:(%S)", "stale");
+		    "rfs_setattr_end:(%S)", "stale");
 		return;
 	}
 
@@ -172,7 +167,7 @@
 		VN_RELE(vp);
 		ns->ns_status = NFSERR_ROFS;
 		TRACE_1(TR_FAC_NFS, TR_RFS_SETATTR_END,
-			"rfs_setattr_end:(%S)", "rofs");
+		    "rfs_setattr_end:(%S)", "rofs");
 		return;
 	}
 
@@ -181,7 +176,7 @@
 		VN_RELE(vp);
 		ns->ns_status = puterrno(error);
 		TRACE_1(TR_FAC_NFS, TR_RFS_SETATTR_END,
-			"rfs_setattr_end:(%S)", "sattr");
+		    "rfs_setattr_end:(%S)", "sattr");
 		return;
 	}
 
@@ -244,7 +239,7 @@
 			VN_RELE(vp);
 			curthread->t_flag |= T_WOULDBLOCK;
 			TRACE_1(TR_FAC_NFS, TR_RFS_SETATTR_END,
-				"rfs_setattr_end:(%S)", "delegated");
+			    "rfs_setattr_end:(%S)", "delegated");
 			return;
 		}
 		if (nbl_need_check(vp)) {
@@ -253,18 +248,16 @@
 		}
 
 		bva.va_mask = AT_UID | AT_SIZE;
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-			"vop_getattr_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 		error = VOP_GETATTR(vp, &bva, 0, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-			"vop_getattr_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 		if (error) {
 			if (in_crit)
 				nbl_end_crit(vp);
 			VN_RELE(vp);
 			ns->ns_status = puterrno(error);
 			TRACE_1(TR_FAC_NFS, TR_RFS_SETATTR_END,
-				"rfs_setattr_end:(%S)", "getattr");
+			    "rfs_setattr_end:(%S)", "getattr");
 			return;
 		}
 
@@ -285,7 +278,7 @@
 		}
 
 		if (crgetuid(cr) == bva.va_uid && !error &&
-			va.va_size != bva.va_size) {
+		    va.va_size != bva.va_size) {
 			va.va_mask &= ~AT_SIZE;
 			bf.l_type = F_WRLCK;
 			bf.l_whence = 0;
@@ -294,11 +287,10 @@
 			bf.l_sysid = 0;
 			bf.l_pid = 0;
 			TRACE_0(TR_FAC_NFS, TR_VOP_SPACE_START,
-				"vop_space_start:");
+			    "vop_space_start:");
 			error = VOP_SPACE(vp, F_FREESP, &bf, FWRITE,
-					(offset_t)va.va_size, cr, NULL);
-			TRACE_0(TR_FAC_NFS, TR_VOP_SPACE_END,
-				"vop_space_end:");
+			    (offset_t)va.va_size, cr, NULL);
+			TRACE_0(TR_FAC_NFS, TR_VOP_SPACE_END, "vop_space_end:");
 		}
 		if (in_crit)
 			nbl_end_crit(vp);
@@ -309,20 +301,16 @@
 	 * Do the setattr.
 	 */
 	if (!error && va.va_mask) {
-		TRACE_0(TR_FAC_NFS, TR_VOP_SETATTR_START,
-			"vop_setattr_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_SETATTR_START, "vop_setattr_start:");
 		error = VOP_SETATTR(vp, &va, flag, cr, NULL);
-		TRACE_0(TR_FAC_NFS, TR_VOP_SETATTR_END,
-			"vop_setattr_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_SETATTR_END, "vop_setattr_end:");
 	}
 
 	if (!error) {
 		va.va_mask = AT_ALL;	/* get everything */
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-			"vop_getattr_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 		error = rfs4_delegated_getattr(vp, &va, 0, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-			"vop_getattr_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 
 		/* check for overflows */
 		if (!error) {
@@ -340,8 +328,7 @@
 
 	ns->ns_status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_SETATTR_END,
-		"rfs_setattr_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_SETATTR_END, "rfs_setattr_end:(%S)", "done");
 }
 void *
 rfs_setattr_getfh(struct nfssaargs *args)
@@ -366,8 +353,7 @@
 	struct sec_ol sec = {0, 0};
 	bool_t publicfh_flag = FALSE, auth_weak = FALSE;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_LOOKUP_START,
-		"rfs_lookup_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_LOOKUP_START, "rfs_lookup_start:");
 
 	/*
 	 * Trusted Extension doesn't support NFSv2. MOUNT
@@ -377,7 +363,7 @@
 	if (is_system_labeled() && req->rq_vers == 2) {
 		dr->dr_status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LOOKUP_END,
-			"rfs_lookup_end:(%S)", "access");
+		    "rfs_lookup_end:(%S)", "access");
 		return;
 	}
 
@@ -387,7 +373,7 @@
 	if (da->da_name == NULL || *da->da_name == '\0') {
 		dr->dr_status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LOOKUP_END,
-			"rfs_lookup_end:(%S)", "access");
+		    "rfs_lookup_end:(%S)", "access");
 		return;
 	}
 
@@ -403,7 +389,7 @@
 		if (dvp == NULL) {
 			dr->dr_status = NFSERR_STALE;
 			TRACE_1(TR_FAC_NFS, TR_RFS_LOOKUP_END,
-				"rfs_lookup_end:(%S)", "stale");
+			    "rfs_lookup_end:(%S)", "stale");
 			return;
 		}
 	}
@@ -418,7 +404,7 @@
 		VN_RELE(dvp);
 		dr->dr_status = NFSERR_NOENT;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LOOKUP_END,
-			"rfs_lookup_end:(%S)", "noent");
+		    "rfs_lookup_end:(%S)", "noent");
 		return;
 	}
 
@@ -434,25 +420,21 @@
 	if (PUBLIC_FH2(fhp)) {
 		publicfh_flag = TRUE;
 		error = rfs_publicfh_mclookup(da->da_name, dvp, cr, &vp, &exi,
-					&sec);
+		    &sec);
 	} else {
 		/*
 		 * Do a normal single component lookup.
 		 */
-		TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_START,
-			"vop_lookup_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_START, "vop_lookup_start:");
 		error = VOP_LOOKUP(dvp, da->da_name, &vp, NULL, 0, NULL, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_END,
-			"vop_lookup_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_END, "vop_lookup_end:");
 	}
 
 	if (!error) {
 		va.va_mask = AT_ALL;	/* we want everything */
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-			"vop_getattr_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 		error = rfs4_delegated_getattr(vp, &va, 0, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-			"vop_getattr_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 		/* check for overflows */
 		if (!error) {
 			acl_perm(vp, exi, &va, cr);
@@ -460,12 +442,12 @@
 			if (!error) {
 				if (sec.sec_flags & SEC_QUERY)
 					error = makefh_ol(&dr->dr_fhandle, exi,
-							sec.sec_index);
+					    sec.sec_index);
 				else {
 					error = makefh(&dr->dr_fhandle, vp,
-								exi);
+					    exi);
 					if (!error && publicfh_flag &&
-						!chk_clnt_sec(exi, req))
+					    !chk_clnt_sec(exi, req))
 						auth_weak = TRUE;
 				}
 			}
@@ -494,8 +476,7 @@
 	else
 		dr->dr_status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_LOOKUP_END,
-		"rfs_lookup_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_LOOKUP_END, "rfs_lookup_end:(%S)", "done");
 }
 void *
 rfs_lookup_getfh(struct nfsdiropargs *da)
@@ -518,31 +499,28 @@
 	vnode_t *vp;
 	struct vattr va;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_READLINK_START,
-		"rfs_readlink_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_READLINK_START, "rfs_readlink_start:");
 
 	vp = nfs_fhtovp(fhp, exi);
 	if (vp == NULL) {
 		rl->rl_data = NULL;
 		rl->rl_status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READLINK_END,
-			"rfs_readlink_end:(%S)", "stale");
+		    "rfs_readlink_end:(%S)", "stale");
 		return;
 	}
 
 	va.va_mask = AT_MODE;
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-		"vop_getattr_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 	error = VOP_GETATTR(vp, &va, 0, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-		"vop_getattr_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 
 	if (error) {
 		VN_RELE(vp);
 		rl->rl_data = NULL;
 		rl->rl_status = puterrno(error);
 		TRACE_1(TR_FAC_NFS, TR_RFS_READLINK_END,
-			"rfs_readlink_end:(%S)", "getattr error");
+		    "rfs_readlink_end:(%S)", "getattr error");
 		return;
 	}
 
@@ -551,7 +529,7 @@
 		rl->rl_data = NULL;
 		rl->rl_status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READLINK_END,
-			"rfs_readlink_end:(%S)", "access");
+		    "rfs_readlink_end:(%S)", "access");
 		return;
 	}
 
@@ -564,7 +542,7 @@
 		rl->rl_data = NULL;
 		rl->rl_status = NFSERR_NXIO;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READLINK_END,
-			"rfs_readlink_end:(%S)", "nxio");
+		    "rfs_readlink_end:(%S)", "nxio");
 		return;
 	}
 
@@ -588,11 +566,9 @@
 	/*
 	 * Do the readlink.
 	 */
-	TRACE_0(TR_FAC_NFS, TR_VOP_READLINK_START,
-		"vop_readlink_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_READLINK_START, "vop_readlink_start:");
 	error = VOP_READLINK(vp, &uio, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_READLINK_END,
-		"vop_readlink_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_READLINK_END, "vop_readlink_end:");
 
 #if 0 /* notyet */
 	/*
@@ -621,7 +597,7 @@
 		rl->rl_status = puterrno(error);
 
 	TRACE_1(TR_FAC_NFS, TR_RFS_READLINK_END,
-		"rfs_readlink_end:(%S)", "done");
+	    "rfs_readlink_end:(%S)", "done");
 }
 void *
 rfs_readlink_getfh(fhandle_t *fhp)
@@ -656,15 +632,14 @@
 	int alloc_err = 0;
 	int in_crit = 0;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_READ_START,
-		"rfs_read_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_READ_START, "rfs_read_start:");
 
 	vp = nfs_fhtovp(&ra->ra_fhandle, exi);
 	if (vp == NULL) {
 		rr->rr_data = NULL;
 		rr->rr_status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-			"rfs_read_end:(%S)", "stale");
+		    "rfs_read_end:(%S)", "stale");
 		return;
 	}
 
@@ -673,7 +648,7 @@
 		rr->rr_data = NULL;
 		rr->rr_status = NFSERR_ISDIR;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-			"rfs_read_end:(%S)", "isdir");
+		    "rfs_read_end:(%S)", "isdir");
 		return;
 	}
 
@@ -687,7 +662,7 @@
 		curthread->t_flag |= T_WOULDBLOCK;
 		rr->rr_data = NULL;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-			"rfs_read_end:(%S)", "delegated");
+		    "rfs_read_end:(%S)", "delegated");
 		return;
 	}
 
@@ -704,38 +679,33 @@
 			rr->rr_data = NULL;
 			rr->rr_status = NFSERR_ACCES;
 			TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-				"rfs_read_end:(%S)", " csf access error");
+			    "rfs_read_end:(%S)", " csf access error");
 			return;
 		}
 		in_crit = 1;
 	}
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_START,
-		"vop_rwlock_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_START, "vop_rwlock_start:");
 	(void) VOP_RWLOCK(vp, V_WRITELOCK_FALSE, NULL);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_END,
-		"vop_rwlock_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_END, "vop_rwlock_end:");
 
 	va.va_mask = AT_ALL;
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-		"vop_getattr_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 	error = VOP_GETATTR(vp, &va, 0, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-		"vop_getattr_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 
 	if (error) {
 		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START,
-			"vop_rwunlock_start:");
+		    "vop_rwunlock_start:");
 		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
 		if (in_crit)
 			nbl_end_crit(vp);
-		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END,
-			"vop_rwunlock_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END, "vop_rwunlock_end:");
 		VN_RELE(vp);
 		rr->rr_data = NULL;
 		rr->rr_status = puterrno(error);
 		TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-			"rfs_read_end:(%S)", "getattr error");
+		    "rfs_read_end:(%S)", "getattr error");
 		return;
 	}
 
@@ -745,52 +715,49 @@
 	 * is always allowed to read it.
 	 */
 	if (crgetuid(cr) != va.va_uid) {
-		TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_START,
-			"vop_access_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_START, "vop_access_start:");
 		error = VOP_ACCESS(vp, VREAD, 0, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_END,
-			"vop_access_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_END, "vop_access_end:");
 		if (error) {
 			/*
 			 * Exec is the same as read over the net because
 			 * of demand loading.
 			 */
 			TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_START,
-				"vop_access_start:");
+			    "vop_access_start:");
 			error = VOP_ACCESS(vp, VEXEC, 0, cr);
 			TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_END,
-				"vop_access_end:");
+			    "vop_access_end:");
 		}
 		if (error) {
 			TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START,
-				"vop_rwunlock_start:");
+			    "vop_rwunlock_start:");
 			VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
 			if (in_crit)
 				nbl_end_crit(vp);
 			TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END,
-				"vop_rwunlock_end:");
+			    "vop_rwunlock_end:");
 			VN_RELE(vp);
 			rr->rr_data = NULL;
 			rr->rr_status = puterrno(error);
 			TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-				"rfs_read_end:(%S)", "access error");
+			    "rfs_read_end:(%S)", "access error");
 			return;
 		}
 	}
 
 	if (MANDLOCK(vp, va.va_mode)) {
 		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START,
-			"vop_rwunlock_start:");
+		    "vop_rwunlock_start:");
 		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
 		if (in_crit)
 			nbl_end_crit(vp);
-		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END,
-			"vop_rwunlock_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END, "vop_rwunlock_end:");
 		VN_RELE(vp);
 		rr->rr_data = NULL;
 		rr->rr_status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-			"rfs_read_end:(%S)", "mand lock");
+		    "rfs_read_end:(%S)", "mand lock");
 		return;
 	}
 
@@ -831,26 +798,23 @@
 	uio.uio_loffset = (offset_t)ra->ra_offset;
 	uio.uio_resid = ra->ra_count;
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_READ_START,
-		"vop_read_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_READ_START, "vop_read_start:");
 	error = VOP_READ(vp, &uio, 0, cr, NULL);
-	TRACE_0(TR_FAC_NFS, TR_VOP_READ_END,
-		"vop_read_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_READ_END, "vop_read_end:");
 
 	if (error) {
 		freeb(mp);
 		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START,
-			"vop_rwunlock_start:");
+		    "vop_rwunlock_start:");
 		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
 		if (in_crit)
 			nbl_end_crit(vp);
-		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END,
-			"vop_rwunlock_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END, "vop_rwunlock_end:");
 		VN_RELE(vp);
 		rr->rr_data = NULL;
 		rr->rr_status = puterrno(error);
 		TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-			"rfs_read_end:(%S)", "read error");
+		    "rfs_read_end:(%S)", "read error");
 		return;
 	}
 
@@ -859,25 +823,23 @@
 	 * time to the client side for his cache.
 	 */
 	va.va_mask = AT_ALL;
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-		"vop_getattr_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 	error = VOP_GETATTR(vp, &va, 0, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-		"vop_getattr_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 	if (error) {
 		freeb(mp);
 		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START,
-			"vop_rwunlock_start:");
+		    "vop_rwunlock_start:");
 		VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
 		if (in_crit)
 			nbl_end_crit(vp);
 		TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END,
-			"vop_rwunlock_end:");
+		    "vop_rwunlock_end:");
 		VN_RELE(vp);
 		rr->rr_data = NULL;
 		rr->rr_status = puterrno(error);
 		TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-			"rfs_read_end:(%S)", "read error");
+		    "rfs_read_end:(%S)", "read error");
 		return;
 	}
 
@@ -886,13 +848,11 @@
 	rr->rr_data = (char *)mp->b_datap->db_base;
 
 done:
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START,
-		"vop_rwunlock_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START, "vop_rwunlock_start:");
 	VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
 	if (in_crit)
 		nbl_end_crit(vp);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END,
-		"vop_rwunlock_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END, "vop_rwunlock_end:");
 
 	acl_perm(vp, exi, &va, cr);
 
@@ -915,8 +875,7 @@
 
 	rr->rr_status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-		"rfs_read_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_READ_END, "rfs_read_end:(%S)", "done");
 }
 
 /*
@@ -970,14 +929,13 @@
 	cred_t *savecred;
 	int in_crit = 0;
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_START,
-		"rfs_write_start:(%S)", "sync");
+	TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_START, "rfs_write_start:(%S)", "sync");
 
 	vp = nfs_fhtovp(&wa->wa_fhandle, exi);
 	if (vp == NULL) {
 		ns->ns_status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-			"rfs_write_end:(%S)", "stale");
+		    "rfs_write_end:(%S)", "stale");
 		return;
 	}
 
@@ -985,7 +943,7 @@
 		VN_RELE(vp);
 		ns->ns_status = NFSERR_ROFS;
 		TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-			"rfs_write_end:(%S)", "rofs");
+		    "rfs_write_end:(%S)", "rofs");
 		return;
 	}
 
@@ -993,7 +951,7 @@
 		VN_RELE(vp);
 		ns->ns_status = NFSERR_ISDIR;
 		TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-			"rfs_write_end:(%S)", "isdir");
+		    "rfs_write_end:(%S)", "isdir");
 		return;
 	}
 
@@ -1006,22 +964,20 @@
 		VN_RELE(vp);
 		curthread->t_flag |= T_WOULDBLOCK;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-			"rfs_write_end:(%S)", "delegated");
+		    "rfs_write_end:(%S)", "delegated");
 		return;
 	}
 
 	va.va_mask = AT_UID|AT_MODE;
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-		"vop_getattr_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 	error = VOP_GETATTR(vp, &va, 0, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-		"vop_getattr_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 
 	if (error) {
 		VN_RELE(vp);
 		ns->ns_status = puterrno(error);
 		TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-			"rfs_write_end:(%S)", "getattr error");
+		    "rfs_write_end:(%S)", "getattr error");
 		return;
 	}
 
@@ -1031,16 +987,14 @@
 		 * with read only permission.  The owner of the file
 		 * is always allowed to write it.
 		 */
-		TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_START,
-			"vop_access_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_START, "vop_access_start:");
 		error = VOP_ACCESS(vp, VWRITE, 0, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_END,
-			"vop_access_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_END, "vop_access_end:");
 		if (error) {
 			VN_RELE(vp);
 			ns->ns_status = puterrno(error);
 			TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-				"rfs_write_end:(%S)", "access error");
+			    "rfs_write_end:(%S)", "access error");
 			return;
 		}
 	}
@@ -1054,7 +1008,7 @@
 		VN_RELE(vp);
 		ns->ns_status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-			"rfs_write_end:(%S)", "mand lock");
+		    "rfs_write_end:(%S)", "mand lock");
 		return;
 	}
 
@@ -1072,11 +1026,9 @@
 		}
 	}
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_START,
-		"vop_rwlock_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_START, "vop_rwlock_start:");
 	(void) VOP_RWLOCK(vp, V_WRITELOCK_TRUE, NULL);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_END,
-		"vop_rwlock_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_END, "vop_rwlock_end:");
 
 	if (wa->wa_data) {
 		iov[0].iov_base = wa->wa_data;
@@ -1100,7 +1052,7 @@
 		 * for now we assume no append mode
 		 */
 		TRACE_1(TR_FAC_NFS, TR_VOP_WRITE_START,
-			"vop_write_start:(%S)", "sync");
+		    "vop_write_start:(%S)", "sync");
 		/*
 		 * We're changing creds because VM may fault and we need
 		 * the cred of the current thread to be used if quota
@@ -1110,8 +1062,7 @@
 		curthread->t_cred = cr;
 		error = VOP_WRITE(vp, &uio, FSYNC, cr, NULL);
 		curthread->t_cred = savecred;
-		TRACE_0(TR_FAC_NFS, TR_VOP_WRITE_END,
-			"vop_write_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_WRITE_END, "vop_write_end:");
 	} else {
 		iovcnt = 0;
 		for (m = wa->wa_mblk; m != NULL; m = m->b_cont)
@@ -1147,7 +1098,7 @@
 		 * For now we assume no append mode.
 		 */
 		TRACE_1(TR_FAC_NFS, TR_VOP_WRITE_START,
-			"vop_write_start:(%S)", "iov sync");
+		    "vop_write_start:(%S)", "iov sync");
 		/*
 		 * We're changing creds because VM may fault and we need
 		 * the cred of the current thread to be used if quota
@@ -1157,18 +1108,15 @@
 		curthread->t_cred = cr;
 		error = VOP_WRITE(vp, &uio, FSYNC, cr, NULL);
 		curthread->t_cred = savecred;
-		TRACE_0(TR_FAC_NFS, TR_VOP_WRITE_END,
-			"vop_write_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_WRITE_END, "vop_write_end:");
 
 		if (iovp != iov)
 			kmem_free(iovp, sizeof (*iovp) * iovcnt);
 	}
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START,
-		"vop_rwunlock_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START, "vop_rwunlock_start:");
 	VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END,
-		"vop_rwunlock_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END, "vop_rwunlock_end:");
 
 	if (!error) {
 		/*
@@ -1176,11 +1124,9 @@
 		 * time to the client side for his cache.
 		 */
 		va.va_mask = AT_ALL;	/* now we want everything */
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-			"vop_getattr_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 		error = VOP_GETATTR(vp, &va, 0, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-			"vop_getattr_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 		/* check for overflows */
 		if (!error) {
 			acl_perm(vp, exi, &va, cr);
@@ -1195,8 +1141,7 @@
 
 	ns->ns_status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-		"rfs_write_end:(%S)", "sync");
+	TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END, "rfs_write_end:(%S)", "sync");
 }
 
 struct rfs_async_write {
@@ -1268,7 +1213,7 @@
 	}
 
 	TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_START,
-		"rfs_write_start:(%S)", "async");
+	    "rfs_write_start:(%S)", "async");
 
 	/*
 	 * Initialize status to RFSWRITE_INITVAL instead of 0, since value of 0
@@ -1319,7 +1264,7 @@
 			cv_wait(&lp->cv, &rfs_async_write_lock);
 		mutex_exit(&rfs_async_write_lock);
 		TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-			"rfs_write_end:(%S)", "cluster child");
+		    "rfs_write_end:(%S)", "cluster child");
 		return;
 	}
 
@@ -1368,7 +1313,7 @@
 		cv_broadcast(&nlp->cv);
 		mutex_exit(&rfs_async_write_lock);
 		TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-			"rfs_write_end:(%S)", "stale");
+		    "rfs_write_end:(%S)", "stale");
 		return;
 	}
 
@@ -1395,7 +1340,7 @@
 		cv_broadcast(&nlp->cv);
 		mutex_exit(&rfs_async_write_lock);
 		TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-			"rfs_write_end:(%S)", "isdir");
+		    "rfs_write_end:(%S)", "isdir");
 		return;
 	}
 
@@ -1412,11 +1357,9 @@
 	 * Lock the file for writing.  This operation provides
 	 * the delay which allows clusters to grow.
 	 */
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_START,
-		"vop_wrlock_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_START, "vop_wrlock_start:");
 	(void) VOP_RWLOCK(vp, V_WRITELOCK_TRUE, NULL);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_END,
-		"vop_wrlock_end");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_END, "vop_wrlock_end");
 
 	/*
 	 * Disconnect this cluster from the list of clusters.
@@ -1469,11 +1412,9 @@
 		}
 
 		va.va_mask = AT_UID|AT_MODE;
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-			"vop_getattr_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 		error = VOP_GETATTR(vp, &va, 0, rp->cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-			"vop_getattr_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 		if (!error) {
 			if (crgetuid(rp->cr) != va.va_uid) {
 				/*
@@ -1483,10 +1424,10 @@
 				 * write it.
 				 */
 				TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_START,
-					"vop_access_start:");
+				    "vop_access_start:");
 				error = VOP_ACCESS(vp, VWRITE, 0, rp->cr);
 				TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_END,
-					"vop_access_end:");
+				    "vop_access_end:");
 			}
 			if (!error && MANDLOCK(vp, va.va_mode))
 				error = EACCES;
@@ -1618,7 +1559,7 @@
 		 * For now we assume no append mode.
 		 */
 		TRACE_1(TR_FAC_NFS, TR_VOP_WRITE_START,
-			"vop_write_start:(%S)", "async");
+		    "vop_write_start:(%S)", "async");
 
 		/*
 		 * Check to see if the v4 side of the server has
@@ -1629,7 +1570,7 @@
 			curthread->t_flag |= T_WOULDBLOCK;
 			error = EACCES; /* just to have an error */
 			TRACE_1(TR_FAC_NFS, TR_RFS_READ_END,
-				"rfs_write_end:(%S)", "delegated");
+			    "rfs_write_end:(%S)", "delegated");
 		} else {
 			/*
 			 * We're changing creds because VM may fault
@@ -1642,7 +1583,7 @@
 			error = VOP_WRITE(vp, &uio, 0, rp->cr, NULL);
 			curthread->t_cred = savecred;
 			TRACE_0(TR_FAC_NFS, TR_VOP_WRITE_END,
-				"vop_write_end:");
+			    "vop_write_end:");
 		}
 
 		if (niovp != iov)
@@ -1656,10 +1597,10 @@
 			 */
 			va.va_mask = AT_ALL;	/* now we want everything */
 			TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-				"vop_getattr_start:");
+			    "vop_getattr_start:");
 			error = VOP_GETATTR(vp, &va, 0, rp->cr);
 			TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-				"vop_getattr_end:");
+			    "vop_getattr_end:");
 			if (!error)
 				acl_perm(vp, exi, &va, rp->cr);
 		}
@@ -1687,25 +1628,20 @@
 	 * the data and metadata to stable storage.
 	 */
 	if (data_written) {
-		TRACE_0(TR_FAC_NFS, TR_VOP_PUTPAGE_START,
-			"vop_putpage_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_PUTPAGE_START, "vop_putpage_start:");
 		error = VOP_PUTPAGE(vp, (u_offset_t)off, len, 0, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_PUTPAGE_END,
-			"vop_putpage_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_PUTPAGE_END, "vop_putpage_end:");
 		if (!error) {
 			TRACE_0(TR_FAC_NFS, TR_VOP_FSYNC_START,
-				"vop_fsync_start:");
+			    "vop_fsync_start:");
 			error = VOP_FSYNC(vp, FNODSYNC, cr);
-			TRACE_0(TR_FAC_NFS, TR_VOP_FSYNC_END,
-				"vop_fsync_end:");
+			TRACE_0(TR_FAC_NFS, TR_VOP_FSYNC_END, "vop_fsync_end:");
 		}
 	}
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START,
-		"vop_rwunlock_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START, "vop_rwunlock_start:");
 	VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END,
-		"vop_rwunlock_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END, "vop_rwunlock_end:");
 
 	if (in_crit)
 		nbl_end_crit(vp);
@@ -1722,8 +1658,7 @@
 	cv_broadcast(&nlp->cv);
 	mutex_exit(&rfs_async_write_lock);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END,
-		"rfs_write_end:(%S)", "async");
+	TRACE_1(TR_FAC_NFS, TR_RFS_WRITE_END, "rfs_write_end:(%S)", "async");
 }
 
 void *
@@ -1753,8 +1688,7 @@
 	int lookup_ok;
 	bool_t trunc;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_CREATE_START,
-		"rfs_create_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_CREATE_START, "rfs_create_start:");
 
 	/*
 	 * Disallow NULL paths
@@ -1762,7 +1696,7 @@
 	if (name == NULL || *name == '\0') {
 		dr->dr_status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_CREATE_END,
-			"rfs_create_end:(%S)", "access");
+		    "rfs_create_end:(%S)", "access");
 		return;
 	}
 
@@ -1770,7 +1704,7 @@
 	if (dvp == NULL) {
 		dr->dr_status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_CREATE_END,
-			"rfs_create_end:(%S)", "stale");
+		    "rfs_create_end:(%S)", "stale");
 		return;
 	}
 
@@ -1778,7 +1712,7 @@
 	if (error) {
 		dr->dr_status = puterrno(error);
 		TRACE_1(TR_FAC_NFS, TR_RFS_CREATE_END,
-			"rfs_create_end:(%S)", "sattr");
+		    "rfs_create_end:(%S)", "sattr");
 		return;
 	}
 
@@ -1789,7 +1723,7 @@
 		VN_RELE(dvp);
 		dr->dr_status = NFSERR_INVAL;
 		TRACE_1(TR_FAC_NFS, TR_RFS_CREATE_END,
-			"rfs_create_end:(%S)", "no mode");
+		    "rfs_create_end:(%S)", "no mode");
 		return;
 	}
 
@@ -1842,21 +1776,19 @@
 	lookup_ok = 0;
 	mode = VWRITE;
 	if (!(va.va_mask & AT_SIZE) || va.va_type != VREG) {
-		TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_START,
-			"vop_lookup_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_START, "vop_lookup_start:");
 		error = VOP_LOOKUP(dvp, name, &tvp, NULL, 0, NULL, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_END,
-			"vop_lookup_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_END, "vop_lookup_end:");
 		if (!error) {
 			struct vattr at;
 
 			lookup_ok = 1;
 			at.va_mask = AT_MODE;
 			TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-				"vop_getattr_start:");
+			    "vop_getattr_start:");
 			error = VOP_GETATTR(tvp, &at, 0, cr);
 			TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-				"vop_getattr_end:");
+			    "vop_getattr_end:");
 			if (!error)
 				mode = (at.va_mode & S_IWUSR) ? VWRITE : VREAD;
 			VN_RELE(tvp);
@@ -1916,7 +1848,7 @@
 				}
 				if (length) {
 					if (nbl_conflict(tvp, NBL_WRITE,
-						offset, length, 0)) {
+					    offset, length, 0)) {
 						error = EACCES;
 					}
 				}
@@ -1940,11 +1872,9 @@
 		    exi->exi_export.ex_flags & EX_NOSUID)
 			va.va_mode &= ~(VSUID | VSGID);
 
-		TRACE_0(TR_FAC_NFS, TR_VOP_CREATE_START,
-			"vop_create_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_CREATE_START, "vop_create_start:");
 		error = VOP_CREATE(dvp, name, &va, NONEXCL, mode, &vp, cr, 0);
-		TRACE_0(TR_FAC_NFS, TR_VOP_CREATE_END,
-			"vop_create_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_CREATE_END, "vop_create_end:");
 
 		if (!error) {
 
@@ -1953,24 +1883,24 @@
 			else
 				trunc = FALSE;
 
-			if (rfs4_check_delegated(FWRITE, tvp, trunc)) {
-				VN_RELE(tvp);
+			if (rfs4_check_delegated(FWRITE, vp, trunc)) {
+				VN_RELE(vp);
 				curthread->t_flag |= T_WOULDBLOCK;
 				goto out;
 			}
 			va.va_mask = AT_ALL;
 			TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-				"vop_getattr_start:");
+			    "vop_getattr_start:");
 			error = VOP_GETATTR(vp, &va, 0, cr);
 			TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-				"vop_getattr_end:");
+			    "vop_getattr_end:");
 			/* check for overflows */
 			if (!error) {
 				acl_perm(vp, exi, &va, cr);
 				error = vattr_to_nattr(&va, &dr->dr_attr);
 				if (!error) {
 					error = makefh(&dr->dr_fhandle, vp,
-							exi);
+					    exi);
 				}
 			}
 			/*
@@ -1997,8 +1927,7 @@
 
 	dr->dr_status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_CREATE_END,
-		"rfs_create_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_CREATE_END, "rfs_create_end:(%S)", "done");
 }
 void *
 rfs_create_getfh(struct nfscreatargs *args)
@@ -2019,8 +1948,7 @@
 	vnode_t *targvp;
 	int in_crit = 0;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_REMOVE_START,
-		"rfs_remove_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_REMOVE_START, "rfs_remove_start:");
 
 	/*
 	 * Disallow NULL paths
@@ -2028,7 +1956,7 @@
 	if (da->da_name == NULL || *da->da_name == '\0') {
 		*status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_REMOVE_END,
-			"rfs_remove_end:(%S)", "access");
+		    "rfs_remove_end:(%S)", "access");
 		return;
 	}
 
@@ -2036,7 +1964,7 @@
 	if (vp == NULL) {
 		*status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_REMOVE_END,
-			"rfs_remove_end:(%S)", "stale");
+		    "rfs_remove_end:(%S)", "stale");
 		return;
 	}
 
@@ -2044,15 +1972,14 @@
 		VN_RELE(vp);
 		*status = NFSERR_ROFS;
 		TRACE_1(TR_FAC_NFS, TR_RFS_REMOVE_END,
-			"rfs_remove_end:(%S)", "rofs");
+		    "rfs_remove_end:(%S)", "rofs");
 		return;
 	}
 
 	/*
 	 * Check for a conflict with a non-blocking mandatory share reservation.
 	 */
-	error = VOP_LOOKUP(vp, da->da_name, &targvp, NULL, 0,
-			NULL, cr);
+	error = VOP_LOOKUP(vp, da->da_name, &targvp, NULL, 0, NULL, cr);
 	if (error != 0) {
 		VN_RELE(vp);
 		*status = puterrno(error);
@@ -2083,11 +2010,9 @@
 		}
 	}
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_REMOVE_START,
-		"vop_remove_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_REMOVE_START, "vop_remove_start:");
 	error = VOP_REMOVE(vp, da->da_name, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_REMOVE_END,
-		"vop_remove_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_REMOVE_END, "vop_remove_end:");
 
 	/*
 	 * Force modified data and metadata out to stable storage.
@@ -2102,8 +2027,7 @@
 
 	*status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_REMOVE_END,
-		"rfs_remove_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_REMOVE_END, "rfs_remove_end:(%S)", "done");
 }
 
 void *
@@ -2129,14 +2053,13 @@
 	vnode_t *targvp;
 	int in_crit = 0;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_RENAME_START,
-		"rfs_rename_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_RENAME_START, "rfs_rename_start:");
 
 	fromvp = nfs_fhtovp(args->rna_from.da_fhandle, exi);
 	if (fromvp == NULL) {
 		*status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_RENAME_END,
-			"rfs_rename_end:(%S)", "from stale");
+		    "rfs_rename_end:(%S)", "from stale");
 		return;
 	}
 
@@ -2146,7 +2069,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_RENAME_END,
-			"rfs_rename_end:(%S)", "cross device");
+		    "rfs_rename_end:(%S)", "cross device");
 		return;
 	}
 	exi_rele(to_exi);
@@ -2155,7 +2078,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_XDEV;
 		TRACE_1(TR_FAC_NFS, TR_RFS_RENAME_END,
-			"rfs_rename_end:(%S)", "from stale");
+		    "rfs_rename_end:(%S)", "from stale");
 		return;
 	}
 
@@ -2164,7 +2087,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_RENAME_END,
-			"rfs_rename_end:(%S)", "to stale");
+		    "rfs_rename_end:(%S)", "to stale");
 		return;
 	}
 
@@ -2172,7 +2095,7 @@
 		VN_RELE(tovp);
 		VN_RELE(fromvp);
 		TRACE_1(TR_FAC_NFS, TR_RFS_RENAME_END,
-			"rfs_rename_end:(%S)", "not dir");
+		    "rfs_rename_end:(%S)", "not dir");
 		*status = NFSERR_NOTDIR;
 		return;
 	}
@@ -2186,7 +2109,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_RENAME_END,
-			"rfs_rename_end:(%S)", "access");
+		    "rfs_rename_end:(%S)", "access");
 		return;
 	}
 
@@ -2195,7 +2118,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_ROFS;
 		TRACE_1(TR_FAC_NFS, TR_RFS_RENAME_END,
-			"rfs_rename_end:(%S)", "rofs");
+		    "rfs_rename_end:(%S)", "rofs");
 		return;
 	}
 
@@ -2203,7 +2126,7 @@
 	 * Check for a conflict with a non-blocking mandatory share reservation.
 	 */
 	error = VOP_LOOKUP(fromvp, args->rna_from.da_name, &srcvp, NULL, 0,
-			NULL, cr);
+	    NULL, cr);
 	if (error != 0) {
 		VN_RELE(tovp);
 		VN_RELE(fromvp);
@@ -2248,12 +2171,10 @@
 		}
 	}
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_RENAME_START,
-		"vop_rename_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RENAME_START, "vop_rename_start:");
 	error = VOP_RENAME(fromvp, args->rna_from.da_name,
 	    tovp, args->rna_to.da_name, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RENAME_END,
-		"vop_rename_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RENAME_END, "vop_rename_end:");
 
 	if (error == 0) {
 		char *tmp;
@@ -2264,7 +2185,7 @@
 		srcvp->v_path = NULL;
 		mutex_exit(&srcvp->v_lock);
 		vn_setpath(rootdir, tovp, srcvp, args->rna_to.da_name,
-				strlen(args->rna_to.da_name));
+		    strlen(args->rna_to.da_name));
 		if (tmp != NULL)
 			kmem_free(tmp, strlen(tmp) + 1);
 	}
@@ -2284,8 +2205,7 @@
 
 	*status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_RENAME_END,
-		"rfs_rename_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_RENAME_END, "rfs_rename_end:(%S)", "done");
 }
 void *
 rfs_rename_getfh(struct nfsrnmargs *args)
@@ -2307,14 +2227,13 @@
 	struct exportinfo *to_exi;
 	fhandle_t *fh;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_LINK_START,
-		"rfs_link_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_LINK_START, "rfs_link_start:");
 
 	fromvp = nfs_fhtovp(args->la_from, exi);
 	if (fromvp == NULL) {
 		*status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LINK_END,
-			"rfs_link_end:(%S)", "from stale");
+		    "rfs_link_end:(%S)", "from stale");
 		return;
 	}
 
@@ -2324,7 +2243,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LINK_END,
-			"rfs_link_end:(%S)", "cross device");
+		    "rfs_link_end:(%S)", "cross device");
 		return;
 	}
 	exi_rele(to_exi);
@@ -2333,7 +2252,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_XDEV;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LINK_END,
-			"rfs_link_end:(%S)", "cross device");
+		    "rfs_link_end:(%S)", "cross device");
 		return;
 	}
 
@@ -2342,7 +2261,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LINK_END,
-			"rfs_link_end:(%S)", "to stale");
+		    "rfs_link_end:(%S)", "to stale");
 		return;
 	}
 
@@ -2351,7 +2270,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_NOTDIR;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LINK_END,
-			"rfs_link_end:(%S)", "not dir");
+		    "rfs_link_end:(%S)", "not dir");
 		return;
 	}
 	/*
@@ -2362,7 +2281,7 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LINK_END,
-			"rfs_link_end:(%S)", "access");
+		    "rfs_link_end:(%S)", "access");
 		return;
 	}
 
@@ -2371,15 +2290,13 @@
 		VN_RELE(fromvp);
 		*status = NFSERR_ROFS;
 		TRACE_1(TR_FAC_NFS, TR_RFS_LINK_END,
-			"rfs_link_end:(%S)", "rofs");
+		    "rfs_link_end:(%S)", "rofs");
 		return;
 	}
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_LINK_START,
-		"vop_link_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_LINK_START, "vop_link_start:");
 	error = VOP_LINK(tovp, fromvp, args->la_to.da_name, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_LINK_END,
-		"vop_link_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_LINK_END, "vop_link_end:");
 
 	/*
 	 * Force modified data and metadata out to stable storage.
@@ -2392,8 +2309,7 @@
 
 	*status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_LINK_END,
-		"rfs_link_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_LINK_END, "rfs_link_end:(%S)", "done");
 }
 void *
 rfs_link_getfh(struct nfslinkargs *args)
@@ -2416,8 +2332,7 @@
 	vnode_t *svp;
 	int lerror;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_SYMLINK_START,
-		"rfs_symlink_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_SYMLINK_START, "rfs_symlink_start:");
 
 	/*
 	 * Disallow NULL paths
@@ -2425,7 +2340,7 @@
 	if (args->sla_from.da_name == NULL || *args->sla_from.da_name == '\0') {
 		*status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_SYMLINK_END,
-			"rfs_symlink_end:(%S)", "access");
+		    "rfs_symlink_end:(%S)", "access");
 		return;
 	}
 
@@ -2433,7 +2348,7 @@
 	if (vp == NULL) {
 		*status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_SYMLINK_END,
-			"rfs_symlink_end:(%S)", "stale");
+		    "rfs_symlink_end:(%S)", "stale");
 		return;
 	}
 
@@ -2441,7 +2356,7 @@
 		VN_RELE(vp);
 		*status = NFSERR_ROFS;
 		TRACE_1(TR_FAC_NFS, TR_RFS_SYMLINK_END,
-			"rfs_symlink_end:(%S)", "rofs");
+		    "rfs_symlink_end:(%S)", "rofs");
 		return;
 	}
 
@@ -2450,7 +2365,7 @@
 		VN_RELE(vp);
 		*status = puterrno(error);
 		TRACE_1(TR_FAC_NFS, TR_RFS_SYMLINK_END,
-			"rfs_symlink_end:(%S)", "sattr");
+		    "rfs_symlink_end:(%S)", "sattr");
 		return;
 	}
 
@@ -2458,28 +2373,24 @@
 		VN_RELE(vp);
 		*status = NFSERR_INVAL;
 		TRACE_1(TR_FAC_NFS, TR_RFS_SYMLINK_END,
-			"rfs_symlink_end:(%S)", "no mode");
+		    "rfs_symlink_end:(%S)", "no mode");
 		return;
 	}
 
 	va.va_type = VLNK;
 	va.va_mask |= AT_TYPE;
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_SYMLINK_START,
-		"vop_symlink_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_SYMLINK_START, "vop_symlink_start:");
 	error = VOP_SYMLINK(vp, args->sla_from.da_name, &va, args->sla_tnm, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_SYMLINK_END,
-		"vop_symlink_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_SYMLINK_END, "vop_symlink_end:");
 
 	/*
 	 * Force new data and metadata out to stable storage.
 	 */
-	TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_START,
-		"vop_lookup_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_START, "vop_lookup_start:");
 	lerror = VOP_LOOKUP(vp, args->sla_from.da_name, &svp, NULL,
 	    0, NULL, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_END,
-		"vop_lookup_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_LOOKUP_END, "vop_lookup_end:");
 	if (!lerror) {
 		(void) VOP_FSYNC(svp, 0, cr);
 		VN_RELE(svp);
@@ -2494,8 +2405,7 @@
 
 	*status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_SYMLINK_END,
-		"rfs_symlink_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_SYMLINK_END, "rfs_symlink_end:(%S)", "done");
 }
 void *
 rfs_symlink_getfh(struct nfsslargs *args)
@@ -2518,8 +2428,7 @@
 	vnode_t *vp;
 	char *name = args->ca_da.da_name;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_MKDIR_START,
-		"rfs_mkdir_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_MKDIR_START, "rfs_mkdir_start:");
 
 	/*
 	 * Disallow NULL paths
@@ -2527,7 +2436,7 @@
 	if (name == NULL || *name == '\0') {
 		dr->dr_status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_MKDIR_END,
-			"rfs_mkdir_end:(%S)", "access");
+		    "rfs_mkdir_end:(%S)", "access");
 		return;
 	}
 
@@ -2535,7 +2444,7 @@
 	if (vp == NULL) {
 		dr->dr_status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_MKDIR_END,
-			"rfs_mkdir_end:(%S)", "stale");
+		    "rfs_mkdir_end:(%S)", "stale");
 		return;
 	}
 
@@ -2543,7 +2452,7 @@
 		VN_RELE(vp);
 		dr->dr_status = NFSERR_ROFS;
 		TRACE_1(TR_FAC_NFS, TR_RFS_MKDIR_END,
-			"rfs_mkdir_end:(%S)", "rofs");
+		    "rfs_mkdir_end:(%S)", "rofs");
 		return;
 	}
 
@@ -2552,7 +2461,7 @@
 		VN_RELE(vp);
 		dr->dr_status = puterrno(error);
 		TRACE_1(TR_FAC_NFS, TR_RFS_MKDIR_END,
-			"rfs_mkdir_end:(%S)", "sattr");
+		    "rfs_mkdir_end:(%S)", "sattr");
 		return;
 	}
 
@@ -2560,18 +2469,16 @@
 		VN_RELE(vp);
 		dr->dr_status = NFSERR_INVAL;
 		TRACE_1(TR_FAC_NFS, TR_RFS_MKDIR_END,
-			"rfs_mkdir_end:(%S)", "no mode");
+		    "rfs_mkdir_end:(%S)", "no mode");
 		return;
 	}
 
 	va.va_type = VDIR;
 	va.va_mask |= AT_TYPE;
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_MKDIR_START,
-		"vop_mkdir_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_MKDIR_START, "vop_mkdir_start:");
 	error = VOP_MKDIR(vp, name, &va, &dvp, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_MKDIR_END,
-		"vop_mkdir_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_MKDIR_END, "vop_mkdir_end:");
 
 	if (!error) {
 		/*
@@ -2579,11 +2486,9 @@
 		 * be returned to the client.
 		 */
 		va.va_mask = AT_ALL; /* We want everything */
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START,
-			"vop_getattr_start:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_START, "vop_getattr_start:");
 		error = VOP_GETATTR(dvp, &va, 0, cr);
-		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END,
-			"vop_getattr_end:");
+		TRACE_0(TR_FAC_NFS, TR_VOP_GETATTR_END, "vop_getattr_end:");
 		/* check for overflows */
 		if (!error) {
 			acl_perm(vp, exi, &va, cr);
@@ -2608,8 +2513,7 @@
 
 	dr->dr_status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_MKDIR_END,
-		"rfs_mkdir_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_MKDIR_END, "rfs_mkdir_end:(%S)", "done");
 }
 void *
 rfs_mkdir_getfh(struct nfscreatargs *args)
@@ -2628,8 +2532,7 @@
 	int error;
 	vnode_t *vp;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_RMDIR_START,
-		"rfs_rmdir_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_RMDIR_START, "rfs_rmdir_start:");
 
 	/*
 	 * Disallow NULL paths
@@ -2637,7 +2540,7 @@
 	if (da->da_name == NULL || *da->da_name == '\0') {
 		*status = NFSERR_ACCES;
 		TRACE_1(TR_FAC_NFS, TR_RFS_RMDIR_END,
-			"rfs_rmdir_end:(%S)", "access");
+		    "rfs_rmdir_end:(%S)", "access");
 		return;
 	}
 
@@ -2645,7 +2548,7 @@
 	if (vp == NULL) {
 		*status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_RMDIR_END,
-			"rfs_rmdir_end:(%S)", "stale");
+		    "rfs_rmdir_end:(%S)", "stale");
 		return;
 	}
 
@@ -2653,7 +2556,7 @@
 		VN_RELE(vp);
 		*status = NFSERR_ROFS;
 		TRACE_1(TR_FAC_NFS, TR_RFS_RMDIR_END,
-			"rfs_rmdir_end:(%S)", "rofs");
+		    "rfs_rmdir_end:(%S)", "rofs");
 		return;
 	}
 
@@ -2666,11 +2569,9 @@
 	 * supplying a vnode known to exist and illegal to
 	 * remove.
 	 */
-	TRACE_0(TR_FAC_NFS, TR_VOP_RMDIR_START,
-		"vop_rmdir_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RMDIR_START, "vop_rmdir_start:");
 	error = VOP_RMDIR(vp, da->da_name, rootdir, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RMDIR_END,
-		"vop_rmdir_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RMDIR_END, "vop_rmdir_end:");
 
 	/*
 	 * Force modified data and metadata out to stable storage.
@@ -2690,8 +2591,7 @@
 	else
 		*status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_RMDIR_END,
-		"rfs_rmdir_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_RMDIR_END, "rfs_rmdir_end:(%S)", "done");
 }
 void *
 rfs_rmdir_getfh(struct nfsdiropargs *da)
@@ -2710,15 +2610,14 @@
 	struct uio uio;
 	vnode_t *vp;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_READDIR_START,
-		"rfs_readdir_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_READDIR_START, "rfs_readdir_start:");
 
 	vp = nfs_fhtovp(&rda->rda_fh, exi);
 	if (vp == NULL) {
 		rd->rd_entries = NULL;
 		rd->rd_status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READDIR_END,
-			"rfs_readdir_end:(%S)", "stale");
+		    "rfs_readdir_end:(%S)", "stale");
 		return;
 	}
 
@@ -2727,21 +2626,17 @@
 		rd->rd_entries = NULL;
 		rd->rd_status = NFSERR_NOTDIR;
 		TRACE_1(TR_FAC_NFS, TR_RFS_READDIR_END,
-			"rfs_readdir_end:(%S)", "notdir");
+		    "rfs_readdir_end:(%S)", "notdir");
 		return;
 	}
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_START,
-		"vop_rwlock_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_START, "vop_rwlock_start:");
 	(void) VOP_RWLOCK(vp, V_WRITELOCK_FALSE, NULL);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_END,
-		"vop_rwlock_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWLOCK_END, "vop_rwlock_end:");
 
-	TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_START,
-		"vop_access_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_START, "vop_access_start:");
 	error = VOP_ACCESS(vp, VREAD, 0, cr);
-	TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_END,
-		"vop_access_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_ACCESS_END, "vop_access_end:");
 	if (error) {
 		rd->rd_entries = NULL;
 		goto bad;
@@ -2777,11 +2672,9 @@
 	/*
 	 * read directory
 	 */
-	TRACE_0(TR_FAC_NFS, TR_VOP_READDIR_START,
-		"vop_readdir_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_READDIR_START, "vop_readdir_start:");
 	error = VOP_READDIR(vp, &uio, cr, &iseof);
-	TRACE_0(TR_FAC_NFS, TR_VOP_READDIR_END,
-		"vop_readdir_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_READDIR_END, "vop_readdir_end:");
 
 	/*
 	 * Clean up
@@ -2801,11 +2694,9 @@
 	}
 
 bad:
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START,
-		"vop_rwunlock_start:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_START, "vop_rwunlock_start:");
 	VOP_RWUNLOCK(vp, V_WRITELOCK_FALSE, NULL);
-	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END,
-		"vop_rwunlock_end:");
+	TRACE_0(TR_FAC_NFS, TR_VOP_RWUNLOCK_END, "vop_rwunlock_end:");
 
 #if 0 /* notyet */
 	/*
@@ -2823,8 +2714,7 @@
 
 	rd->rd_status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_READDIR_END,
-		"rfs_readdir_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_READDIR_END, "rfs_readdir_end:(%S)", "done");
 }
 void *
 rfs_readdir_getfh(struct nfsrddirargs *rda)
@@ -2847,14 +2737,13 @@
 	struct statvfs64 sb;
 	vnode_t *vp;
 
-	TRACE_0(TR_FAC_NFS, TR_RFS_STATFS_START,
-		"rfs_statfs_start:");
+	TRACE_0(TR_FAC_NFS, TR_RFS_STATFS_START, "rfs_statfs_start:");
 
 	vp = nfs_fhtovp(fh, exi);
 	if (vp == NULL) {
 		fs->fs_status = NFSERR_STALE;
 		TRACE_1(TR_FAC_NFS, TR_RFS_STATFS_END,
-			"rfs_statfs_end:(%S)", "stale");
+		    "rfs_statfs_end:(%S)", "stale");
 		return;
 	}
 
@@ -2872,8 +2761,7 @@
 
 	fs->fs_status = puterrno(error);
 
-	TRACE_1(TR_FAC_NFS, TR_RFS_STATFS_END,
-		"rfs_statfs_end:(%S)", "done");
+	TRACE_1(TR_FAC_NFS, TR_RFS_STATFS_END, "rfs_statfs_end:(%S)", "done");
 }
 void *
 rfs_statfs_getfh(fhandle_t *fh)
--- a/usr/src/uts/common/fs/vnode.c	Fri Sep 14 10:25:36 2007 -0700
+++ b/usr/src/uts/common/fs/vnode.c	Fri Sep 14 11:24:08 2007 -0700
@@ -103,6 +103,39 @@
 int vopstats_enabled = 1;
 
 /*
+ * forward declarations for internal vnode specific data (vsd)
+ */
+static void *vsd_realloc(void *, size_t, size_t);
+
+/*
+ * VSD -- VNODE SPECIFIC DATA
+ * The v_data pointer is typically used by a file system to store a
+ * pointer to the file system's private node (e.g. ufs inode, nfs rnode).
+ * However, there are times when additional project private data needs
+ * to be stored separately from the data (node) pointed to by v_data.
+ * This additional data could be stored by the file system itself or
+ * by a completely different kernel entity.  VSD provides a way for
+ * callers to obtain a key and store a pointer to private data associated
+ * with a vnode.
+ *
+ * Callers are responsible for protecting the vsd by holding v_lock
+ * for calls to vsd_set() and vsd_get().
+ */
+
+/*
+ * vsd_lock protects:
+ *   vsd_nkeys - creation and deletion of vsd keys
+ *   vsd_list - insertion and deletion of vsd_node in the vsd_list
+ *   vsd_destructor - adding and removing destructors to the list
+ */
+static kmutex_t		vsd_lock;
+static uint_t		vsd_nkeys;	 /* size of destructor array */
+/* list of vsd_node's */
+static list_t *vsd_list = NULL;
+/* per-key destructor funcs */
+static void 		(**vsd_destructor)(void *);
+
+/*
  * The following is the common set of actions needed to update the
  * vopstats structure from a vnode op.  Both VOPSTATS_UPDATE() and
  * VOPSTATS_UPDATE_IO() do almost the same thing, except for the
@@ -859,8 +892,7 @@
 
 		if (error =
 		    vn_createat(pnamep, seg, &vattr, excl, mode, &vp, crwhy,
-		    (filemode & ~(FTRUNC|FEXCL)),
-		    umask, startvp))
+		    (filemode & ~(FTRUNC|FEXCL)), umask, startvp))
 			return (error);
 	} else {
 		/*
@@ -2027,6 +2059,7 @@
 	vp->v_femhead = NULL;	/* Must be done before vn_reinit() */
 	vp->v_path = NULL;
 	vp->v_mpssdata = NULL;
+	vp->v_vsd = NULL;
 	vp->v_fopdata = NULL;
 
 	return (0);
@@ -2099,6 +2132,7 @@
 		free_fopdata(vp);
 	}
 	vp->v_mpssdata = NULL;
+	vsd_free(vp);
 }
 
 /*
@@ -2184,6 +2218,7 @@
 		free_fopdata(vp);
 	}
 	vp->v_mpssdata = NULL;
+	vsd_free(vp);
 	kmem_cache_free(vn_cache, vp);
 }
 
@@ -3647,3 +3682,262 @@
 	VOPSTATS_UPDATE(vp, vnevent);
 	return (err);
 }
+
+/*
+ * Default destructor
+ *	Needed because NULL destructor means that the key is unused
+ */
+/* ARGSUSED */
+void
+vsd_defaultdestructor(void *value)
+{}
+
+/*
+ * Create a key (index into per vnode array)
+ *	Locks out vsd_create, vsd_destroy, and vsd_free
+ *	May allocate memory with lock held
+ */
+void
+vsd_create(uint_t *keyp, void (*destructor)(void *))
+{
+	int	i;
+	uint_t	nkeys;
+
+	/*
+	 * if key is allocated, do nothing
+	 */
+	mutex_enter(&vsd_lock);
+	if (*keyp) {
+		mutex_exit(&vsd_lock);
+		return;
+	}
+	/*
+	 * find an unused key
+	 */
+	if (destructor == NULL)
+		destructor = vsd_defaultdestructor;
+
+	for (i = 0; i < vsd_nkeys; ++i)
+		if (vsd_destructor[i] == NULL)
+			break;
+
+	/*
+	 * if no unused keys, increase the size of the destructor array
+	 */
+	if (i == vsd_nkeys) {
+		if ((nkeys = (vsd_nkeys << 1)) == 0)
+			nkeys = 1;
+		vsd_destructor =
+		    (void (**)(void *))vsd_realloc((void *)vsd_destructor,
+		    (size_t)(vsd_nkeys * sizeof (void (*)(void *))),
+		    (size_t)(nkeys * sizeof (void (*)(void *))));
+		vsd_nkeys = nkeys;
+	}
+
+	/*
+	 * allocate the next available unused key
+	 */
+	vsd_destructor[i] = destructor;
+	*keyp = i + 1;
+
+	/* create vsd_list, if it doesn't exist */
+	if (vsd_list == NULL) {
+		vsd_list = kmem_alloc(sizeof (list_t), KM_SLEEP);
+		list_create(vsd_list, sizeof (struct vsd_node),
+		    offsetof(struct vsd_node, vs_nodes));
+	}
+
+	mutex_exit(&vsd_lock);
+}
+
+/*
+ * Destroy a key
+ *
+ * Assumes that the caller is preventing vsd_set and vsd_get
+ * Locks out vsd_create, vsd_destroy, and vsd_free
+ * May free memory with lock held
+ */
+void
+vsd_destroy(uint_t *keyp)
+{
+	uint_t key;
+	struct vsd_node *vsd;
+
+	/*
+	 * protect the key namespace and our destructor lists
+	 */
+	mutex_enter(&vsd_lock);
+	key = *keyp;
+	*keyp = 0;
+
+	ASSERT(key <= vsd_nkeys);
+
+	/*
+	 * if the key is valid
+	 */
+	if (key != 0) {
+		uint_t k = key - 1;
+		/*
+		 * for every vnode with VSD, call key's destructor
+		 */
+		for (vsd = list_head(vsd_list); vsd != NULL;
+		    vsd = list_next(vsd_list, vsd)) {
+			/*
+			 * no VSD for key in this vnode
+			 */
+			if (key > vsd->vs_nkeys)
+				continue;
+			/*
+			 * call destructor for key
+			 */
+			if (vsd->vs_value[k] && vsd_destructor[k])
+				(*vsd_destructor[k])(vsd->vs_value[k]);
+			/*
+			 * reset value for key
+			 */
+			vsd->vs_value[k] = NULL;
+		}
+		/*
+		 * actually free the key (NULL destructor == unused)
+		 */
+		vsd_destructor[k] = NULL;
+	}
+
+	mutex_exit(&vsd_lock);
+}
+
+/*
+ * Quickly return the per vnode value that was stored with the specified key
+ * Assumes the caller is protecting key from vsd_create and vsd_destroy
+ * Assumes the caller is holding v_lock to protect the vsd.
+ */
+void *
+vsd_get(vnode_t *vp, uint_t key)
+{
+	struct vsd_node *vsd;
+
+	/*
+	 * The caller needs to pass a valid vnode.
+	 */
+	ASSERT(vp != NULL);
+	if (vp == NULL)
+		return (NULL);
+
+	vsd = vp->v_vsd;
+
+	if (key && vsd != NULL && key <= vsd->vs_nkeys)
+		return (vsd->vs_value[key - 1]);
+	return (NULL);
+}
+
+/*
+ * Set a per vnode value indexed with the specified key
+ * Assumes the caller is holding v_lock to protect the vsd.
+ */
+int
+vsd_set(vnode_t *vp, uint_t key, void *value)
+{
+	struct vsd_node *vsd = vp->v_vsd;
+
+	if (key == 0)
+		return (EINVAL);
+	if (vsd == NULL)
+		vsd = vp->v_vsd = kmem_zalloc(sizeof (*vsd), KM_SLEEP);
+
+	/*
+	 * If the vsd was just allocated, vs_nkeys will be 0, so the following
+	 * code won't happen and we will continue down and allocate space for
+	 * the vs_value array.
+	 * If the caller is replacing one value with another, then it is up
+	 * to the caller to free/rele/destroy the previous value (if needed).
+	 */
+	if (key <= vsd->vs_nkeys) {
+		vsd->vs_value[key - 1] = value;
+		return (0);
+	}
+
+	ASSERT(key <= vsd_nkeys);
+
+	if (vsd->vs_nkeys == 0) {
+		mutex_enter(&vsd_lock);	/* lock out vsd_destroy() */
+		/*
+		 * Link onto list of all VSD nodes.
+		 */
+		list_insert_head(vsd_list, vsd);
+		mutex_exit(&vsd_lock);
+	}
+
+	/*
+	 * Allocate vnode local storage and set the value for key
+	 */
+	vsd->vs_value = vsd_realloc(vsd->vs_value,
+	    vsd->vs_nkeys * sizeof (void *),
+	    key * sizeof (void *));
+	vsd->vs_nkeys = key;
+	vsd->vs_value[key - 1] = value;
+
+	return (0);
+}
+
+/*
+ * Called from vn_free() to run the destructor function for each vsd
+ *	Locks out vsd_create and vsd_destroy
+ *	Assumes that the destructor *DOES NOT* use vsd
+ */
+void
+vsd_free(vnode_t *vp)
+{
+	int i;
+	struct vsd_node *vsd = vp->v_vsd;
+
+	if (vsd == NULL)
+		return;
+
+	if (vsd->vs_nkeys == 0) {
+		kmem_free(vsd, sizeof (*vsd));
+		vp->v_vsd = NULL;
+		return;
+	}
+
+	/*
+	 * lock out vsd_create and vsd_destroy, call
+	 * the destructor, and mark the value as destroyed.
+	 */
+	mutex_enter(&vsd_lock);
+
+	for (i = 0; i < vsd->vs_nkeys; i++) {
+		if (vsd->vs_value[i] && vsd_destructor[i])
+			(*vsd_destructor[i])(vsd->vs_value[i]);
+		vsd->vs_value[i] = NULL;
+	}
+
+	/*
+	 * remove from linked list of VSD nodes
+	 */
+	list_remove(vsd_list, vsd);
+
+	mutex_exit(&vsd_lock);
+
+	/*
+	 * free up the VSD
+	 */
+	kmem_free(vsd->vs_value, vsd->vs_nkeys * sizeof (void *));
+	kmem_free(vsd, sizeof (struct vsd_node));
+	vp->v_vsd = NULL;
+}
+
+/*
+ * realloc
+ */
+static void *
+vsd_realloc(void *old, size_t osize, size_t nsize)
+{
+	void *new;
+
+	new = kmem_zalloc(nsize, KM_SLEEP);
+	if (old) {
+		bcopy(old, new, osize);
+		kmem_free(old, osize);
+	}
+	return (new);
+}
--- a/usr/src/uts/common/sys/vnode.h	Fri Sep 14 10:25:36 2007 -0700
+++ b/usr/src/uts/common/sys/vnode.h	Fri Sep 14 11:24:08 2007 -0700
@@ -51,6 +51,7 @@
 #include <vm/seg_enum.h>
 #include <sys/kstat.h>
 #include <sys/kmem.h>
+#include <sys/list.h>
 #ifdef	_KERNEL
 #include <sys/buf.h>
 #endif	/* _KERNEL */
@@ -169,6 +170,16 @@
 } vtype_t;
 
 /*
+ * VSD - Vnode Specific Data
+ * Used to associate additional private data with a vnode.
+ */
+struct vsd_node {
+	list_node_t vs_nodes;		/* list of all VSD nodes */
+	uint_t vs_nkeys;		/* entries in value array */
+	void **vs_value;		/* array of value/key */
+};
+
+/*
  * Many of the fields in the vnode are read-only once they are initialized
  * at vnode creation time.  Other fields are protected by locks.
  *
@@ -182,6 +193,7 @@
  *   v_count
  *   v_shrlocks
  *   v_path
+ *   v_vsd
  *
  * A special lock (implemented by vn_vfswlock in vnode.c) protects:
  *   v_vfsmountedhere
@@ -249,6 +261,7 @@
 	struct vnode	*v_msprev;	/* list of vnodes on an mset */
 	krwlock_t	v_mslock;	/* protects v_mset */
 	void		*v_fopdata;	/* list of file ops event watches */
+	struct vsd_node *v_vsd;		/* vnode specific data */
 } vnode_t;
 
 #define	IS_DEVVP(vp)	\
@@ -924,6 +937,13 @@
 void	vnevent_mountedover(vnode_t *);
 int	vnevent_support(vnode_t *);
 
+/* Vnode specific data */
+void vsd_create(uint_t *, void (*)(void *));
+void vsd_destroy(uint_t *);
+void *vsd_get(vnode_t *, uint_t);
+int vsd_set(vnode_t *, uint_t, void *);
+void vsd_free(vnode_t *);
+
 /* Context identification */
 u_longlong_t	fs_new_caller_id();