summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-03-24 06:00:45 +0000
committerjeff <jeff@FreeBSD.org>2005-03-24 06:00:45 +0000
commit6ef6841ac5948e40ecfdad9ab3c9672288be3f87 (patch)
treed01a9bfbd422429e683b0799edbdd3eb8a28b841
parent89443b9b9a418c0d6a9cc7bc15fda74af5616325 (diff)
downloadFreeBSD-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.c62
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);
}
OpenPOWER on IntegriCloud