Author: avg
Date: Mon May 16 15:48:56 2016
New Revision: 299951
URL: https://svnweb.freebsd.org/changeset/base/299951

Log:
  do not destroy 'snapdir' when it becomes  inactive
  
  That was just wrong.  In fact, we can safely keep this static entry when
  it's inactive.
  Now the destructive action is moved to the reclaim method and the
  function is renamed from zfsctl_snapdir_inactive(0 to
  zfsctl_snapdir_reclaim().
  
  Also, we can use gfs_vop_reclaim() instead of gfs_dir_inactive() +
  kmem_free().
  
  Lastly, we can just assert that the node does not any children when it
  is reclaimed, even on the force unmount.  That's because zfs_umount()
  does an extra vflush() pass which should destroy all snapshot-mountpoint
  vnodes that are the snapdir's children.
  
  MFC after:    5 weeks

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c    Mon May 
16 15:42:59 2016        (r299950)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c    Mon May 
16 15:48:56 2016        (r299951)
@@ -454,25 +454,6 @@ zfsctl_shares_fid(ap)
        return (error);
 }
 
-static int
-zfsctl_common_reclaim(ap)
-       struct vop_reclaim_args /* {
-               struct vnode *a_vp;
-               struct thread *a_td;
-       } */ *ap;
-{
-       vnode_t *vp = ap->a_vp;
-
-       /*
-        * Destroy the vm object and flush associated pages.
-        */
-       vnode_destroy_vobject(vp);
-       VI_LOCK(vp);
-       vp->v_data = NULL;
-       VI_UNLOCK(vp);
-       return (0);
-}
-
 /*
  * .zfs inode namespace
  *
@@ -1377,8 +1358,8 @@ zfsctl_snapdir_getattr(ap)
 
 /* ARGSUSED */
 static int
-zfsctl_snapdir_inactive(ap)
-       struct vop_inactive_args /* {
+zfsctl_snapdir_reclaim(ap)
+       struct vop_reclaim_args /* {
                struct vnode *a_vp;
                struct thread *a_td;
        } */ *ap;
@@ -1387,21 +1368,10 @@ zfsctl_snapdir_inactive(ap)
        zfsctl_snapdir_t *sdp = vp->v_data;
        zfs_snapentry_t *sep;
 
-       /*
-        * On forced unmount we have to free snapshots from here.
-        */
-       mutex_enter(&sdp->sd_lock);
-       while ((sep = avl_first(&sdp->sd_snaps)) != NULL) {
-               avl_remove(&sdp->sd_snaps, sep);
-               kmem_free(sep->se_name, strlen(sep->se_name) + 1);
-               kmem_free(sep, sizeof (zfs_snapentry_t));
-       }
-       mutex_exit(&sdp->sd_lock);
-       gfs_dir_inactive(vp);
        ASSERT(avl_numnodes(&sdp->sd_snaps) == 0);
        mutex_destroy(&sdp->sd_lock);
        avl_destroy(&sdp->sd_snaps);
-       kmem_free(sdp, sizeof (zfsctl_snapdir_t));
+       gfs_vop_reclaim(ap);
 
        return (0);
 }
@@ -1448,8 +1418,8 @@ static struct vop_vector zfsctl_ops_snap
        .vop_mkdir =    zfsctl_freebsd_snapdir_mkdir,
        .vop_readdir =  gfs_vop_readdir,
        .vop_lookup =   zfsctl_snapdir_lookup,
-       .vop_inactive = zfsctl_snapdir_inactive,
-       .vop_reclaim =  zfsctl_common_reclaim,
+       .vop_inactive = VOP_NULL,
+       .vop_reclaim =  zfsctl_snapdir_reclaim,
        .vop_fid =      zfsctl_common_fid,
 };
 
_______________________________________________
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