A previous change moved the GETATTR RPC for open() calls that hit in the
name cache up into nfs_lookup() instead of nfs_open(). Continue this trend by flushing the attribute cache for leaf nodes in nfs_lookup() during an open() if we do a LOOKUP RPC. For NFSv3 this should generally be a NOP as the attributes are flushed before fetching the post-op attributes from the LOOKUP RPC which most (all?) NFSv3 servers provide, so the post-op attributes should populate the cache. Now all NFS open() calls will always clear the cached attributes during the nfs_lookup() prior to nfs_open() in the !NMODIFIED case to provide CTOC. As a result, we can remove the conditional flushing of the attribute cache from nfs_open(). Reviewed by: rmacklem, bde MFC after: 2 weeks
This commit is contained in:
parent
985fda3dfe
commit
72ccfc240b
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=209948
@ -538,15 +538,6 @@ nfs_open(struct vop_open_args *ap)
|
|||||||
np->n_mtime = vattr.va_mtime;
|
np->n_mtime = vattr.va_mtime;
|
||||||
mtx_unlock(&np->n_mtx);
|
mtx_unlock(&np->n_mtx);
|
||||||
} else {
|
} else {
|
||||||
struct thread *td = curthread;
|
|
||||||
|
|
||||||
if (np->n_ac_ts_syscalls != td->td_syscalls ||
|
|
||||||
np->n_ac_ts_tid != td->td_tid ||
|
|
||||||
td->td_proc == NULL ||
|
|
||||||
np->n_ac_ts_pid != td->td_proc->p_pid) {
|
|
||||||
np->n_attrstamp = 0;
|
|
||||||
KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(vp);
|
|
||||||
}
|
|
||||||
mtx_unlock(&np->n_mtx);
|
mtx_unlock(&np->n_mtx);
|
||||||
error = VOP_GETATTR(vp, &vattr, ap->a_cred);
|
error = VOP_GETATTR(vp, &vattr, ap->a_cred);
|
||||||
if (error)
|
if (error)
|
||||||
@ -1123,6 +1114,20 @@ nfs_lookup(struct vop_lookup_args *ap)
|
|||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
newvp = NFSTOV(np);
|
newvp = NFSTOV(np);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flush the attribute cache when opening a leaf node
|
||||||
|
* to ensure that fresh attributes are fetched in
|
||||||
|
* nfs_open() if we are unable to fetch attributes
|
||||||
|
* from the LOOKUP reply.
|
||||||
|
*/
|
||||||
|
if ((flags & (ISLASTCN | ISOPEN)) == (ISLASTCN | ISOPEN) &&
|
||||||
|
!(np->n_flag & NMODIFIED)) {
|
||||||
|
mtx_lock(&np->n_mtx);
|
||||||
|
np->n_attrstamp = 0;
|
||||||
|
KDTRACE_NFS_ATTRCACHE_FLUSH_DONE(newvp);
|
||||||
|
mtx_unlock(&np->n_mtx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (v3) {
|
if (v3) {
|
||||||
nfsm_postop_attr(newvp, attrflag);
|
nfsm_postop_attr(newvp, attrflag);
|
||||||
|
Loading…
Reference in New Issue
Block a user