Mercurial > illumos > illumos-gate
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);