- Remove code to set SAVENAME for CREATE or RENAME requests that get a -ve
hit in the name cache. cache_lookup() doesn't actually return ENOENT for such requests to force the filesystem to do an explicit lookup, so this was effectively dead code. - Grab the nfsnode mutex while writing to n_dmtime. We don't grab the lock when comparing the time against the cached directory mod time (just as we don't when comparing ctime's for +ve name cache hits) since the attribute caching is already racy for NFS clients as it is. Discussed with: bde
This commit is contained in:
parent
f0bf25503d
commit
62fc1c4fbf
@ -923,14 +923,12 @@ nfs_lookup(struct vop_lookup_args *ap)
|
||||
if (VOP_GETATTR(dvp, &vattr, cnp->cn_cred) == 0 &&
|
||||
vattr.va_mtime.tv_sec == np->n_dmtime) {
|
||||
nfsstats.lookupcache_hits++;
|
||||
if ((cnp->cn_nameiop == CREATE ||
|
||||
cnp->cn_nameiop == RENAME) &&
|
||||
(flags & ISLASTCN))
|
||||
cnp->cn_flags |= SAVENAME;
|
||||
return (ENOENT);
|
||||
}
|
||||
cache_purge_negative(dvp);
|
||||
mtx_lock(&np->n_mtx);
|
||||
np->n_dmtime = 0;
|
||||
mtx_unlock(&np->n_mtx);
|
||||
}
|
||||
error = 0;
|
||||
newvp = NULLVP;
|
||||
@ -1041,8 +1039,10 @@ nfsmout:
|
||||
* name cache entry for this directory was
|
||||
* added.
|
||||
*/
|
||||
mtx_lock(&np->n_mtx);
|
||||
if (np->n_dmtime == 0)
|
||||
np->n_dmtime = np->n_vattr.va_mtime.tv_sec;
|
||||
mtx_unlock(&np->n_mtx);
|
||||
cache_enter(dvp, NULL, cnp);
|
||||
}
|
||||
return (ENOENT);
|
||||
|
Loading…
x
Reference in New Issue
Block a user