svn commit: r306803 - in head/sys: cddl/contrib/opensolaris/uts/common/fs/zfs kern sys
Konstantin Belousov
kib at FreeBSD.org
Fri Oct 7 11:38:29 UTC 2016
Author: kib
Date: Fri Oct 7 11:38:28 2016
New Revision: 306803
URL: https://svnweb.freebsd.org/changeset/base/306803
Log:
Limit scope of the optimization in r306608 to dounmount() caller only.
Other uses of cache_purgevfs() do rely on the cache purge for correct
operations, when paths are invalidated without unmount.
Reported and tested by: jkim
Discussed with: mjg
Sponsored by: The FreeBSD Foundation
Modified:
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
head/sys/kern/vfs_cache.c
head/sys/kern/vfs_mount.c
head/sys/kern/vfs_mountroot.c
head/sys/sys/vnode.h
Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c Fri Oct 7 10:47:32 2016 (r306802)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c Fri Oct 7 11:38:28 2016 (r306803)
@@ -1843,7 +1843,7 @@ zfsvfs_teardown(zfsvfs_t *zfsvfs, boolea
*/
(void) dnlc_purge_vfsp(zfsvfs->z_parent->z_vfs, 0);
#ifdef FREEBSD_NAMECACHE
- cache_purgevfs(zfsvfs->z_parent->z_vfs);
+ cache_purgevfs(zfsvfs->z_parent->z_vfs, true);
#endif
}
Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c Fri Oct 7 10:47:32 2016 (r306802)
+++ head/sys/kern/vfs_cache.c Fri Oct 7 11:38:28 2016 (r306803)
@@ -1756,7 +1756,7 @@ cache_purge_negative(struct vnode *vp)
* Flush all entries referencing a particular filesystem.
*/
void
-cache_purgevfs(struct mount *mp)
+cache_purgevfs(struct mount *mp, bool force)
{
TAILQ_HEAD(, namecache) ncps;
struct mtx *vlp1, *vlp2;
@@ -1768,7 +1768,7 @@ cache_purgevfs(struct mount *mp)
/* Scan hash tables for applicable entries */
SDT_PROBE1(vfs, namecache, purgevfs, done, mp);
- if (mp->mnt_nvnodelistsize <= ncpurgeminvnodes)
+ if (!force && mp->mnt_nvnodelistsize <= ncpurgeminvnodes)
return;
TAILQ_INIT(&ncps);
n_nchash = nchash + 1;
Modified: head/sys/kern/vfs_mount.c
==============================================================================
--- head/sys/kern/vfs_mount.c Fri Oct 7 10:47:32 2016 (r306802)
+++ head/sys/kern/vfs_mount.c Fri Oct 7 11:38:28 2016 (r306803)
@@ -1352,7 +1352,7 @@ dounmount(struct mount *mp, int flags, s
mp->mnt_flag &= ~MNT_ASYNC;
mp->mnt_kern_flag &= ~MNTK_ASYNC;
MNT_IUNLOCK(mp);
- cache_purgevfs(mp); /* remove cache entries for this file sys */
+ cache_purgevfs(mp, false); /* remove cache entries for this file sys */
vfs_deallocate_syncvnode(mp);
/*
* For forced unmounts, move process cdir/rdir refs on the fs root
Modified: head/sys/kern/vfs_mountroot.c
==============================================================================
--- head/sys/kern/vfs_mountroot.c Fri Oct 7 10:47:32 2016 (r306802)
+++ head/sys/kern/vfs_mountroot.c Fri Oct 7 11:38:28 2016 (r306803)
@@ -298,9 +298,9 @@ vfs_mountroot_shuffle(struct thread *td,
TAILQ_INSERT_TAIL(&mountlist, mpdevfs, mnt_list);
mtx_unlock(&mountlist_mtx);
- cache_purgevfs(mporoot);
+ cache_purgevfs(mporoot, true);
if (mporoot != mpdevfs)
- cache_purgevfs(mpdevfs);
+ cache_purgevfs(mpdevfs, true);
VFS_ROOT(mporoot, LK_EXCLUSIVE, &vporoot);
@@ -315,7 +315,7 @@ vfs_mountroot_shuffle(struct thread *td,
/* Set up the new rootvnode, and purge the cache */
mpnroot->mnt_vnodecovered = NULL;
set_rootvnode();
- cache_purgevfs(rootvnode->v_mount);
+ cache_purgevfs(rootvnode->v_mount, true);
if (mporoot != mpdevfs) {
/* Remount old root under /.mount or /mnt */
Modified: head/sys/sys/vnode.h
==============================================================================
--- head/sys/sys/vnode.h Fri Oct 7 10:47:32 2016 (r306802)
+++ head/sys/sys/vnode.h Fri Oct 7 11:38:28 2016 (r306803)
@@ -608,7 +608,7 @@ int cache_lookup(struct vnode *dvp, stru
struct componentname *cnp, struct timespec *tsp, int *ticksp);
void cache_purge(struct vnode *vp);
void cache_purge_negative(struct vnode *vp);
-void cache_purgevfs(struct mount *mp);
+void cache_purgevfs(struct mount *mp, bool force);
int change_dir(struct vnode *vp, struct thread *td);
void cvtstat(struct stat *st, struct ostat *ost);
void cvtnstat(struct stat *sb, struct nstat *nsb);
More information about the svn-src-all
mailing list