Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 4 May 2010 05:25:48 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r207598 - in stable/8/sys: fs/pseudofs kern ufs/ufs
Message-ID:  <201005040525.o445PmuP012929@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Tue May  4 05:25:48 2010
New Revision: 207598
URL: http://svn.freebsd.org/changeset/base/207598

Log:
  MFC r206894:
  The cache_enter(9) function shall not be called for doomed dvp.
  Assert this.
  
  Verify that dvp is not reclaimed before calling cache_enter().

Modified:
  stable/8/sys/fs/pseudofs/pseudofs_vnops.c
  stable/8/sys/kern/vfs_cache.c
  stable/8/sys/ufs/ufs/ufs_lookup.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)
  stable/8/sys/geom/sched/   (props changed)

Modified: stable/8/sys/fs/pseudofs/pseudofs_vnops.c
==============================================================================
--- stable/8/sys/fs/pseudofs/pseudofs_vnops.c	Tue May  4 05:17:11 2010	(r207597)
+++ stable/8/sys/fs/pseudofs/pseudofs_vnops.c	Tue May  4 05:25:48 2010	(r207598)
@@ -542,7 +542,7 @@ pfs_lookup(struct vop_cachedlookup_args 
 
 	if (cnp->cn_flags & ISDOTDOT)
 		vn_lock(vn, LK_EXCLUSIVE|LK_RETRY);
-	if (cnp->cn_flags & MAKEENTRY)
+	if (cnp->cn_flags & MAKEENTRY && !(vn->v_iflag & VI_DOOMED))
 		cache_enter(vn, *vpp, cnp);
 	PFS_RETURN (0);
  failed:

Modified: stable/8/sys/kern/vfs_cache.c
==============================================================================
--- stable/8/sys/kern/vfs_cache.c	Tue May  4 05:17:11 2010	(r207597)
+++ stable/8/sys/kern/vfs_cache.c	Tue May  4 05:25:48 2010	(r207598)
@@ -611,6 +611,8 @@ cache_enter(dvp, vp, cnp)
 	CTR3(KTR_VFS, "cache_enter(%p, %p, %s)", dvp, vp, cnp->cn_nameptr);
 	VNASSERT(vp == NULL || (vp->v_iflag & VI_DOOMED) == 0, vp,
 	    ("cache_enter: Adding a doomed vnode"));
+	VNASSERT(dvp == NULL || (dvp->v_iflag & VI_DOOMED) == 0, dvp,
+	    ("cache_enter: Doomed vnode used as src"));
 
 	if (!doingcache)
 		return;

Modified: stable/8/sys/ufs/ufs/ufs_lookup.c
==============================================================================
--- stable/8/sys/ufs/ufs/ufs_lookup.c	Tue May  4 05:17:11 2010	(r207597)
+++ stable/8/sys/ufs/ufs/ufs_lookup.c	Tue May  4 05:25:48 2010	(r207598)
@@ -704,6 +704,14 @@ found:
 				vn_lock(vdp, LK_UPGRADE | LK_RETRY);
 			else /* if (ltype == LK_SHARED) */
 				vn_lock(vdp, LK_DOWNGRADE | LK_RETRY);
+			/*
+			 * Relock for the "." case may left us with
+			 * reclaimed vnode.
+			 */
+			if (vdp->v_iflag & VI_DOOMED) {
+				vrele(vdp);
+				return (ENOENT);
+			}
 		}
 		*vpp = vdp;
 	} else {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005040525.o445PmuP012929>