cvs commit: src/sys/kern vfs_lookup.c

Jeff Roberson jroberson at chesapeake.net
Sat Apr 9 05:25:08 PDT 2005


On Sat, 9 Apr 2005, Jeff Roberson wrote:

> jeff        2005-04-09 11:53:16 UTC
>
>   FreeBSD src repository
>
>   Modified files:
>     sys/kern             vfs_lookup.c

With this change I'm able to make -j128 buildworld on a nullfs mount of
/usr/src at the same time as doing the same on the real /usr/src.  The
intrduction of a vn_lock in vrele() more than 5 years ago broke this by
creating a lock order reversal in every place that vrele'd the dvp before
droping a child's lock.

>   Log:
>    - If we vrele() a dvp while the child is locked we can potentially deadlock
>      when vrele() acquires the directory lock in the wrong order.  Fix this
>      via the following changes:
>    - Keep the directory locked after VOP_LOOKUP() until we've determined
>      what we're going to do with the child.  This allows us to remove the
>      complicated post LOOKUP code which determins whether we should lock or
>      unlock the parent.  This means we may have to vput() in the appropriate
>      cases later, rather than doing an unsafe vrele.
>    - in NDFREE() keep two flags to indicate whether we need to unlock vp or
>      dvp.  This allows us to vput rather than vrele in the appropriate
>      cases without rechecking the flags.  Move the code to handle dvp after
>      we handle vp.
>    - Remove some dead code from namei() that was the result of changes to
>      VFS_LOCK_GIANT().
>
>   Sponsored by:   Isilon Systems, Inc.
>
>   Revision  Changes    Path
>   1.78      +60 -51    src/sys/kern/vfs_lookup.c
>


More information about the cvs-all mailing list