mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-22 08:14:06 +00:00
- 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
4cf172fd65
commit
667c6c197e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=189639
|
@ -923,14 +923,12 @@ nfs_lookup(struct vop_lookup_args *ap)
|
||||||
if (VOP_GETATTR(dvp, &vattr, cnp->cn_cred) == 0 &&
|
if (VOP_GETATTR(dvp, &vattr, cnp->cn_cred) == 0 &&
|
||||||
vattr.va_mtime.tv_sec == np->n_dmtime) {
|
vattr.va_mtime.tv_sec == np->n_dmtime) {
|
||||||
nfsstats.lookupcache_hits++;
|
nfsstats.lookupcache_hits++;
|
||||||
if ((cnp->cn_nameiop == CREATE ||
|
|
||||||
cnp->cn_nameiop == RENAME) &&
|
|
||||||
(flags & ISLASTCN))
|
|
||||||
cnp->cn_flags |= SAVENAME;
|
|
||||||
return (ENOENT);
|
return (ENOENT);
|
||||||
}
|
}
|
||||||
cache_purge_negative(dvp);
|
cache_purge_negative(dvp);
|
||||||
|
mtx_lock(&np->n_mtx);
|
||||||
np->n_dmtime = 0;
|
np->n_dmtime = 0;
|
||||||
|
mtx_unlock(&np->n_mtx);
|
||||||
}
|
}
|
||||||
error = 0;
|
error = 0;
|
||||||
newvp = NULLVP;
|
newvp = NULLVP;
|
||||||
|
@ -1041,8 +1039,10 @@ nfs_lookup(struct vop_lookup_args *ap)
|
||||||
* name cache entry for this directory was
|
* name cache entry for this directory was
|
||||||
* added.
|
* added.
|
||||||
*/
|
*/
|
||||||
|
mtx_lock(&np->n_mtx);
|
||||||
if (np->n_dmtime == 0)
|
if (np->n_dmtime == 0)
|
||||||
np->n_dmtime = np->n_vattr.va_mtime.tv_sec;
|
np->n_dmtime = np->n_vattr.va_mtime.tv_sec;
|
||||||
|
mtx_unlock(&np->n_mtx);
|
||||||
cache_enter(dvp, NULL, cnp);
|
cache_enter(dvp, NULL, cnp);
|
||||||
}
|
}
|
||||||
return (ENOENT);
|
return (ENOENT);
|
||||||
|
|
Loading…
Reference in a new issue