Author: avg
Date: Wed Jul 13 11:08:50 2016
New Revision: 302763
URL: https://svnweb.freebsd.org/changeset/base/302763

Log:
  MFC r300130: zfsctl_freebsd_root_lookup: gfs_vop_lookup may return a
  doomed vnode

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 11:06:37 2016        (r302762)
+++ stable/9/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c        
Wed Jul 13 11:08:50 2016        (r302763)
@@ -600,20 +600,25 @@ zfsctl_freebsd_root_lookup(ap)
 
        ASSERT(ap->a_cnp->cn_namelen < sizeof(nm));
        strlcpy(nm, ap->a_cnp->cn_nameptr, ap->a_cnp->cn_namelen + 1);
-
+relookup:
        err = zfsctl_root_lookup(dvp, nm, vpp, NULL, 0, NULL, cr, NULL, NULL, 
NULL);
        if (err == 0 && (nm[0] != '.' || nm[1] != '\0')) {
-               if (flags & ISDOTDOT)
+               if (flags & ISDOTDOT) {
                        VOP_UNLOCK(dvp, 0);
-               err = vn_lock(*vpp, lkflags);
-               if (err != 0) {
-                       vrele(*vpp);
-                       *vpp = NULL;
-               }
-               if (flags & ISDOTDOT)
+                       err = vn_lock(*vpp, lkflags);
+                       if (err != 0) {
+                               vrele(*vpp);
+                               *vpp = NULL;
+                       }
                        vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY);
+               } else {
+                       err = vn_lock(*vpp, LK_EXCLUSIVE);
+                       if (err != 0) {
+                               VERIFY3S(err, ==, ENOENT);
+                               goto relookup;
+                       }
+               }
        }
-
        return (err);
 }
 
_______________________________________________
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