svn commit: r197131 -
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Pawel Jakub Dawidek
pjd at FreeBSD.org
Sat Sep 12 19:27:55 UTC 2009
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" <7ogcg7g02 at sneakemail.com>, kris
Fix based on patch from: Jaakko Heinonen <jh at 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);
More information about the svn-src-head
mailing list