cvs commit: src/sys/kern vfs_lookup.c

Alfred Perlstein alfred at freebsd.org
Tue Aug 30 22:47:05 GMT 2005


Ok, maybe I'm missing something, but...

	while (dp->v_type == VDIR && (mp = dp->v_mountedhere) &&
	       (cnp->cn_flags & NOCROSSMOUNT) == 0) {
		KASSERT(dp != ndp->ni_dvp, ("XXX"));
		if (vfs_busy(mp, 0, 0, td))
			continue;
here ->>>	vput(dp);
		tvfslocked = VFS_LOCK_GIANT(mp);
		VFS_UNLOCK_GIANT(vfslocked);
		vfslocked = tvfslocked;
		VOP_UNLOCK(ndp->ni_dvp, 0, td);
		error = VFS_ROOT(mp, cnp->cn_lkflags, &tdp, td);
		VOP_LOCK(ndp->ni_dvp, cnp->cn_lkflags | LK_RETRY, td);
		vfs_unbusy(mp, td);
		if (error) {
			dpunlocked = 1;
			goto bad2;
		}
		ndp->ni_vp = dp = tdp;
	}

Isn't dp already unlocked here?  vput should be unlocking the vnode
and we have the above KASSERT showing that they should be the same
vnode...

Also, I think lockparent doesn't need to be respected because
we're trading parent vnodes.  Basically, we're hitting a vnode
that has another vnode stacked on it (root vnode), and switching to it.
we're not actually decending.

Is this OK?

-Alfred



* Alexander Kabaev <kan at FreeBSD.org> [050830 09:12] wrote:
> kan         2005-08-30 16:12:03 UTC
> 
>   FreeBSD src repository
> 
>   Modified files:        (Branch: RELENG_6)
>     sys/kern             vfs_lookup.c 
>   Log:
>   MFC r1.81:
>   Do not keep parent directory locked while calling VFS_ROOT to
>   traverse mount points in lookup(). The lock can be dropped safely
>   around VFS_ROOT because LOCKPARENT semantics with child and parent
>   vnodes coming from different FSes does not really have any meaningful
>   use and we do not really care about parent state after we relock it.
>   This prevents easily triggered deadlock on systems using automounter
>   daemon.
>   
>   Approved by:    re (scottl)
>   
>   Revision  Changes    Path
>   1.80.2.1  +2 -0      src/sys/kern/vfs_lookup.c

-- 
- Alfred Perlstein


More information about the cvs-src mailing list