usr/src/uts/common/fs/nfs/nfs4_srv.c
changeset 154 7a745d3804a2
parent 0 68f95e015346
child 254 349581d9fc98
--- a/usr/src/uts/common/fs/nfs/nfs4_srv.c	Mon Jul 11 11:11:42 2005 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs4_srv.c	Mon Jul 11 17:12:14 2005 -0700
@@ -3709,20 +3709,30 @@
 		if ((error = VOP_REMOVE(dvp, nm, cs->cr)) == 0 &&
 			fp != NULL) {
 			struct vattr va;
-
-			/*
-			 * This is va_seq safe because we are not
-			 * manipulating dvp.
-			 */
-			va.va_mask = AT_NLINK;
-			if (!VOP_GETATTR(fp->vp, &va, 0, cs->cr) &&
-				va.va_nlink == 0) {
-				/* The file is gone and so should the state */
-				if (in_crit) {
-					nbl_end_crit(vp);
-					in_crit = 0;
+			vnode_t *tvp;
+
+			rfs4_dbe_lock(fp->dbe);
+			tvp = fp->vp;
+			if (tvp)
+				VN_HOLD(tvp);
+			rfs4_dbe_unlock(fp->dbe);
+
+			if (tvp) {
+				/*
+				 * This is va_seq safe because we are not
+				 * manipulating dvp.
+				 */
+				va.va_mask = AT_NLINK;
+				if (!VOP_GETATTR(tvp, &va, 0, cs->cr) &&
+					va.va_nlink == 0) {
+					/* Remove state on file remove */
+					if (in_crit) {
+						nbl_end_crit(vp);
+						in_crit = 0;
+					}
+					rfs4_close_all_state(fp);
 				}
-				rfs4_close_all_state(fp);
+				VN_RELE(tvp);
 			}
 		}
 	}
@@ -3968,16 +3978,26 @@
 	if ((error = VOP_RENAME(odvp, onm, ndvp, nnm, cs->cr)) == 0 &&
 		fp != NULL) {
 		struct vattr va;
-
-		va.va_mask = AT_NLINK;
-		if (!VOP_GETATTR(fp->vp, &va, 0, cs->cr) &&
-			va.va_nlink == 0) {
-			/* The file is gone and so should the state */
-			if (in_crit_targ) {
-				nbl_end_crit(targvp);
-				in_crit_targ = 0;
+		vnode_t *tvp;
+
+		rfs4_dbe_lock(fp->dbe);
+		tvp = fp->vp;
+		if (tvp)
+			VN_HOLD(tvp);
+		rfs4_dbe_unlock(fp->dbe);
+
+		if (tvp) {
+			va.va_mask = AT_NLINK;
+			if (!VOP_GETATTR(tvp, &va, 0, cs->cr) &&
+				va.va_nlink == 0) {
+				/* The file is gone and so should the state */
+				if (in_crit_targ) {
+					nbl_end_crit(targvp);
+					in_crit_targ = 0;
+				}
+				rfs4_close_all_state(fp);
 			}
-			rfs4_close_all_state(fp);
+			VN_RELE(tvp);
 		}
 	}