svn commit: r207598 - in stable/8/sys: fs/pseudofs kern ufs/ufs
Konstantin Belousov
kib at FreeBSD.org
Tue May 4 05:25:48 UTC 2010
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 {
More information about the svn-src-stable-8
mailing list