Acquire Giant around two more cases when calling into VFS to vput()

a vnode.  Not bumped into with asserts in the main tree because we
run the NFS server with Giant by default.  Discovered by inspection.

Complete annotations of Giant acquisition/release to note that it's
only because of VFS that we acquire Giant in most places in the NFS
server.
This commit is contained in:
Robert Watson 2004-05-30 22:41:43 +00:00
parent 2c81db6cb5
commit 53f137e9d3
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=129885

View File

@ -214,10 +214,10 @@ nfsrv3_access(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsrv_access(vp, VEXEC, cred, rdonly, td, 0))
nfsmode &= ~testmode;
NFSD_UNLOCK();
mtx_lock(&Giant);
mtx_lock(&Giant); /* VFS */
getret = VOP_GETATTR(vp, vap, cred, td);
vput(vp);
mtx_unlock(&Giant);
mtx_unlock(&Giant); /* VFS */
vp = NULL;
NFSD_LOCK();
nfsm_reply(NFSX_POSTOPATTR(1) + NFSX_UNSIGNED);
@ -263,10 +263,10 @@ nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
goto nfsmout;
}
NFSD_UNLOCK();
mtx_lock(&Giant);
mtx_lock(&Giant); /* VFS */
error = VOP_GETATTR(vp, vap, cred, td);
vput(vp);
mtx_unlock(&Giant);
mtx_unlock(&Giant); /* VFS */
vp = NULL;
NFSD_LOCK();
nfsm_reply(NFSX_FATTR(nfsd->nd_flag & ND_NFSV3));
@ -280,8 +280,13 @@ nfsrv_getattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
/* fall through */
nfsmout:
if (vp)
if (vp) {
NFSD_UNLOCK();
mtx_lock(&Giant); /* VFS */
vput(vp);
mtx_unlock(&Giant); /* VFS */
NFSD_LOCK();
}
return(error);
}
@ -321,9 +326,9 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
goto out;
}
NFSD_UNLOCK();
mtx_lock(&Giant);
mtx_lock(&Giant); /* VFS */
(void) vn_start_write(NULL, &mp, V_WAIT);
mtx_unlock(&Giant);
mtx_unlock(&Giant); /* VFS */
NFSD_LOCK();
VATTR_NULL(vap);
if (v3) {
@ -451,11 +456,11 @@ nfsrv_setattr(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsmout:
NFSD_UNLOCK();
mtx_lock(&Giant);
mtx_lock(&Giant); /* VFS */
if (vp)
vput(vp);
vn_finished_write(mp);
mtx_unlock(&Giant);
mtx_unlock(&Giant); /* VFS */
NFSD_LOCK();
return(error);
}
@ -593,7 +598,7 @@ nfsrv_lookup(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
*/
if (error) {
mtx_unlock(&Giant);
mtx_unlock(&Giant); /* VFS */
NFSD_LOCK();
nfsm_reply(NFSX_POSTOPATTR(v3));
if (v3)
@ -3102,7 +3107,11 @@ nfsrv_rmdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
error = nfs_namei(&nd, fhp, len, slp, nam, &md, &dpos,
&dirp, v3, &dirfor, &dirfor_ret, td, FALSE);
if (dirp && !v3) {
NFSD_UNLOCK();
mtx_lock(&Giant); /* VFS */
vrele(dirp);
mtx_unlock(&Giant); /* VFS */
NFSD_LOCK();
dirp = NULL;
}
if (error) {
@ -3322,7 +3331,7 @@ nfsrv_readdir(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
}
if (error) {
vput(vp);
mtx_unlock(&Giant);
mtx_unlock(&Giant); /* VFS */
NFSD_LOCK();
vp = NULL;
nfsm_reply(NFSX_POSTOPATTR(v3));
@ -4178,9 +4187,9 @@ nfsrv_statfs(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
nfsmout:
if (vp) {
NFSD_UNLOCK();
mtx_lock(&Giant);
mtx_lock(&Giant); /* VFS */
vput(vp);
mtx_unlock(&Giant);
mtx_unlock(&Giant); /* VFS */
NFSD_LOCK();
}
return(error);