changeset 3807:c02340118a61

6321353 5.10 NFSv3 client code breaks if mounted share is accessed after unshare
author gt29601
date Tue, 13 Mar 2007 10:49:24 -0700
parents 38a133f54518
children e20b58e8d14b
files usr/src/uts/common/fs/nfs/nfs3_vfsops.c usr/src/uts/common/fs/nfs/nfs_vfsops.c
diffstat 2 files changed, 32 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/nfs/nfs3_vfsops.c	Mon Mar 12 21:00:37 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs3_vfsops.c	Tue Mar 13 10:49:24 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -1445,6 +1445,8 @@
 	mntinfo_t *mi;
 	vnode_t *vp;
 	servinfo_t *svp;
+	rnode_t *rp;
+	int error = 0;
 
 	mi = VFTOMI(vfsp);
 
@@ -1456,15 +1458,25 @@
 		mutex_enter(&svp->sv_lock);
 		svp->sv_flags &= ~SV_ROOT_STALE;
 		mutex_exit(&svp->sv_lock);
-		return (ENOENT);
+		error = ENOENT;
 	}
 
 	vp = makenfs3node((nfs_fh3 *)&mi->mi_curr_serv->sv_fhandle,
 	    NULL, vfsp, gethrtime(), CRED(), NULL, NULL);
 
-	if (VTOR(vp)->r_flags & RSTALE) {
+	/*
+	 * if the SV_ROOT_STALE flag was reset above, reset the
+	 * RSTALE flag if needed and return an error
+	 */
+	if (error == ENOENT) {
+		rp = VTOR(vp);
+		if (svp && rp->r_flags & RSTALE) {
+			mutex_enter(&rp->r_statelock);
+			rp->r_flags &= ~RSTALE;
+			mutex_exit(&rp->r_statelock);
+		}
 		VN_RELE(vp);
-		return (ENOENT);
+		return (error);
 	}
 
 	ASSERT(vp->v_type == VNON || vp->v_type == mi->mi_type);
--- a/usr/src/uts/common/fs/nfs/nfs_vfsops.c	Mon Mar 12 21:00:37 2007 -0700
+++ b/usr/src/uts/common/fs/nfs/nfs_vfsops.c	Tue Mar 13 10:49:24 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  *
  *	Copyright (c) 1983,1984,1985,1986,1987,1988,1989  AT&T.
@@ -1445,6 +1445,8 @@
 	mntinfo_t *mi;
 	vnode_t *vp;
 	servinfo_t *svp;
+	rnode_t *rp;
+	int error = 0;
 
 	mi = VFTOMI(vfsp);
 
@@ -1456,15 +1458,25 @@
 		mutex_enter(&svp->sv_lock);
 		svp->sv_flags &= ~SV_ROOT_STALE;
 		mutex_exit(&svp->sv_lock);
-		return (ENOENT);
+		error = ENOENT;
 	}
 
 	vp = makenfsnode((fhandle_t *)mi->mi_curr_serv->sv_fhandle.fh_buf,
 	    NULL, vfsp, gethrtime(), CRED(), NULL, NULL);
 
-	if (VTOR(vp)->r_flags & RSTALE) {
+	/*
+	 * if the SV_ROOT_STALE flag was reset above, reset the
+	 * RSTALE flag if needed and return an error
+	 */
+	if (error == ENOENT) {
+		rp = VTOR(vp);
+		if (svp && rp->r_flags & RSTALE) {
+			mutex_enter(&rp->r_statelock);
+			rp->r_flags &= ~RSTALE;
+			mutex_exit(&rp->r_statelock);
+		}
 		VN_RELE(vp);
-		return (ENOENT);
+		return (error);
 	}
 
 	ASSERT(vp->v_type == VNON || vp->v_type == mi->mi_type);