This change grabs the vnode lock for NFS client vnodes when calling

VOP_SETATTR() or VOP_GETATTR(); without these locks (a) VFS_DEBUG_LOCKS
will panic, and (b) it may be possible to corrupt entries in the cached
vnode attributes in the nfsnode, since nfsnode attribute cache data is
also protected by the vnode lock.

Approved by:	re (jhb)
Pointed out by:	VFS_DEBUG_LOCKS
This commit is contained in:
Robert Watson 2003-05-15 21:12:08 +00:00
parent 62d4b85ec1
commit 7042ac8cd7
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=115041
2 changed files with 7 additions and 1 deletions

View File

@ -1063,6 +1063,8 @@ nfs_vinvalbuf(struct vnode *vp, int flags, struct ucred *cred,
struct nfsmount *nmp = VFSTONFS(vp->v_mount);
int error = 0, slpflag, slptimeo;
ASSERT_VOP_LOCKED(vp, "nfs_vinvalbuf");
VI_LOCK(vp);
if (vp->v_iflag & VI_XLOCK) {
/* XXX Should we wait here? */
@ -1344,7 +1346,7 @@ nfs_doio(struct buf *bp, struct ucred *cr, struct thread *td)
uiop->uio_resid = 0;
}
}
ASSERT_VOP_LOCKED(vp, "nfs_doio");
/* ASSERT_VOP_LOCKED(vp, "nfs_doio"); */
if (p && (vp->v_vflag & VV_TEXT) &&
(np->n_mtime != np->n_vattr.va_mtime.tv_sec)) {
uprintf("Process killed due to text file modification\n");

View File

@ -526,7 +526,9 @@ nfs_close(struct vop_close_args *ap)
error = nfs_flush(vp, ap->a_cred, MNT_WAIT, ap->a_td, cm);
/* np->n_flag &= ~NMODIFIED; */
} else {
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, ap->a_td);
error = nfs_vinvalbuf(vp, V_SAVE, ap->a_cred, ap->a_td, 1);
VOP_UNLOCK(vp, 0, ap->a_td);
}
np->n_attrstamp = 0;
}
@ -3131,7 +3133,9 @@ nfsfifo_close(struct vop_close_args *ap)
vattr.va_atime = np->n_atim;
if (np->n_flag & NUPD)
vattr.va_mtime = np->n_mtim;
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, ap->a_td);
(void)VOP_SETATTR(vp, &vattr, ap->a_cred, ap->a_td);
VOP_UNLOCK(vp, 0, ap->a_td);
}
}
return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_close), ap));