Author: avg
Date: Wed Jul 13 10:11:57 2016
New Revision: 302749
URL: https://svnweb.freebsd.org/changeset/base/302749

Log:
  MFC r299945: avoid deadlock between zfsctl_snapdir_lookup and
  zfsctl_snapshot_reclaim

Modified:
  stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
Directory Properties:
  stable/9/sys/   (props changed)
  stable/9/sys/cddl/contrib/opensolaris/   (props changed)

Modified: stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
==============================================================================
--- stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c        
Wed Jul 13 10:11:48 2016        (r302748)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c        
Wed Jul 13 10:11:57 2016        (r302749)
@@ -997,6 +997,7 @@ zfsctl_snapdir_lookup(ap)
 #endif
        }
 
+relookup:
        mutex_enter(&sdp->sd_lock);
        search.se_name = (char *)nm;
        if ((sep = avl_find(&sdp->sd_snaps, &search, &where)) != NULL) {
@@ -1064,7 +1065,16 @@ domount:
        (void) snprintf(mountpoint, mountpoint_len,
            "%s/" ZFS_CTLDIR_NAME "/snapshot/%s",
            dvp->v_vfsp->mnt_stat.f_mntonname, nm);
-       VERIFY0(vn_lock(*vpp, LK_EXCLUSIVE));
+       mutex_exit(&sdp->sd_lock);
+
+       /*
+        * The vnode may get reclaimed between dropping sd_lock and
+        * getting the vnode lock.
+        * */
+       err = vn_lock(*vpp, LK_EXCLUSIVE);
+       if (err == ENOENT)
+               goto relookup;
+       VERIFY0(err);
        err = mount_snapshot(curthread, vpp, "zfs", mountpoint, snapname, 0);
        kmem_free(mountpoint, mountpoint_len);
        if (err == 0) {
@@ -1078,7 +1088,6 @@ domount:
                ASSERT(VTOZ(*vpp)->z_zfsvfs != zfsvfs);
                VTOZ(*vpp)->z_zfsvfs->z_parent = zfsvfs;
        }
-       mutex_exit(&sdp->sd_lock);
        ZFS_EXIT(zfsvfs);
 
 #ifdef illumos
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to