- 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.
This commit is contained in:
Jeff Roberson 2005-03-24 06:00:45 +00:00
parent 44fcb6c430
commit fdd6a3ff3c

View file

@ -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);
}