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);
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to