mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 00:32:25 -04:00
- 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:
parent
44fcb6c430
commit
fdd6a3ff3c
1 changed files with 10 additions and 52 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue