diff options
author | jeff <jeff@FreeBSD.org> | 2005-03-24 06:00:45 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2005-03-24 06:00:45 +0000 |
commit | 6ef6841ac5948e40ecfdad9ab3c9672288be3f87 (patch) | |
tree | d01a9bfbd422429e683b0799edbdd3eb8a28b841 | |
parent | 89443b9b9a418c0d6a9cc7bc15fda74af5616325 (diff) | |
download | FreeBSD-src-6ef6841ac5948e40ecfdad9ab3c9672288be3f87.zip FreeBSD-src-6ef6841ac5948e40ecfdad9ab3c9672288be3f87.tar.gz |
- All of the bugs which lead to the complication of the LOOKUP_SHARED
config option have now been fixed. All filesystems are properly locked
and checked via DEBUG_VFS_LOCKS. Remove the workaround code.
Sponsored by: Isilon Systems, Inc.
-rw-r--r-- | sys/kern/vfs_cache.c | 62 |
1 files changed, 10 insertions, 52 deletions
diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index 942aae2..9d32ca6 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -653,36 +653,14 @@ vfs_cache_lookup(ap) error = cache_lookup(dvp, vpp, cnp); -#ifdef LOOKUP_SHARED if (!error) { - /* We do this because the rest of the system now expects to get - * a shared lock, which is later upgraded if LOCKSHARED is not - * set. We have so many cases here because of bugs that yield - * inconsistant lock states. This all badly needs to be fixed - */ error = VOP_CACHEDLOOKUP(dvp, vpp, cnp); - if (!error) { - int flock; - - flock = VOP_ISLOCKED(*vpp, td); - if (flock != LK_EXCLUSIVE) { - if (flock == 0) { - if ((flags & ISLASTCN) && - (flags & LOCKSHARED)) - VOP_LOCK(*vpp, LK_SHARED, td); - else - VOP_LOCK(*vpp, LK_EXCLUSIVE, td); - } - } else if ((flags & ISLASTCN) && (flags & LOCKSHARED)) - VOP_LOCK(*vpp, LK_DOWNGRADE, td); - } +#ifdef LOOKUP_SHARED + if (!error && (flags & ISLASTCN) && (flags & LOCKSHARED)) + VOP_LOCK(*vpp, LK_DOWNGRADE, td); +#endif return (error); } -#else - if (!error) - return (VOP_CACHEDLOOKUP(dvp, vpp, cnp)); -#endif - if (error == ENOENT) return (error); @@ -699,10 +677,8 @@ vfs_cache_lookup(ap) if ((flags & ISLASTCN) && (flags & LOCKSHARED)) error = vget(vp, LK_SHARED, td); else - error = vget(vp, LK_EXCLUSIVE, td); -#else - error = vget(vp, LK_EXCLUSIVE, td); #endif + error = vget(vp, LK_EXCLUSIVE, td); if (!error && lockparent && (flags & ISLASTCN)) { if ((error = vn_lock(dvp, LK_EXCLUSIVE, td)) == 0) @@ -713,10 +689,8 @@ vfs_cache_lookup(ap) if ((flags & ISLASTCN) && (flags & LOCKSHARED)) error = vget(vp, LK_SHARED, td); else - error = vget(vp, LK_EXCLUSIVE, td); -#else - error = vget(vp, LK_EXCLUSIVE, td); #endif + error = vget(vp, LK_EXCLUSIVE, td); if (!lockparent || error || !(flags & ISLASTCN)) { VOP_UNLOCK(dvp, 0, td); cnp->cn_flags |= PDIRUNLOCK; @@ -741,28 +715,12 @@ vfs_cache_lookup(ap) return (error); cnp->cn_flags &= ~PDIRUNLOCK; } -#ifdef LOOKUP_SHARED error = VOP_CACHEDLOOKUP(dvp, vpp, cnp); - - if (!error) { - int flock = 0; - - flock = VOP_ISLOCKED(*vpp, td); - if (flock != LK_EXCLUSIVE) { - if (flock == 0) { - if ((flags & ISLASTCN) && (flags & LOCKSHARED)) - VOP_LOCK(*vpp, LK_SHARED, td); - else - VOP_LOCK(*vpp, LK_EXCLUSIVE, td); - } - } else if ((flags & ISLASTCN) && (flags & LOCKSHARED)) - VOP_LOCK(*vpp, LK_DOWNGRADE, td); - } - - return (error); -#else - return (VOP_CACHEDLOOKUP(dvp, vpp, cnp)); +#ifdef LOOKUP_SHARED + if (!error && (flags & ISLASTCN) && (flags & LOCKSHARED)) + VOP_LOCK(*vpp, LK_DOWNGRADE, td); #endif + return (error); } |