Author: pjd
Date: Sat Sep 12 19:27:54 2009
New Revision: 197131
URL: http://svn.freebsd.org/changeset/base/197131

Log:
  Tighten up the check for race in zfs_zget() - ZTOV(zp) can not only contain
  NULL, but also can point to dead vnode, take that into account.
  
  PR:           kern/132068
  Reported by:  Edward Fisk" <7ogcg7...@sneakemail.com>, kris
  Fix based on patch from:      Jaakko Heinonen <j...@saunalahti.fi>
  MFC after:    1 week

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

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c     Sat Sep 
12 19:07:03 2009        (r197130)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c     Sat Sep 
12 19:27:54 2009        (r197131)
@@ -890,8 +890,16 @@ again:
                if (zp->z_unlinked) {
                        err = ENOENT;
                } else {
-                       if (ZTOV(zp) != NULL)
-                               VN_HOLD(ZTOV(zp));
+                       if ((vp = ZTOV(zp)) != NULL) {
+                               VI_LOCK(vp);
+                               if ((vp->v_iflag & VI_DOOMED) != 0) {
+                                       VI_UNLOCK(vp);
+                                       vp = NULL;
+                               } else
+                                       VI_UNLOCK(vp);
+                       }
+                       if (vp != NULL)
+                               VN_HOLD(vp);
                        else {
                                if (first) {
                                        ZFS_LOG(1, "dying znode detected 
(zp=%p)", zp);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to