Currently we call vinvalbuf(9) in a few places while holding
AFS_GLOCK, but AFS_GLOCK is a non-sleepable lock (struct mtx), and
vinvalbuf can sleep. This can trigger a panic in some rare conditions,
with the message:
Sleeping thread (tid 100179, pid 95481) owns a non-sleepable lock
To avoid this, drop AFS_GLOCK around a few places that call
vinvalbuf().
Change-Id: I58acb144b6ffa007675402e7639b63ff3745dec5
Reviewed-on: https://gerrit.openafs.org/13970
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>
}
VI_UNLOCK(vp);
+ AFS_GUNLOCK();
+
islocked = islocked_vnode(vp);
if (islocked == LK_EXCLOTHER)
panic("Trying to Smush over someone else's lock");
lock_vnode(vp, LK_DOWNGRADE);
else if (!islocked)
unlock_vnode(vp);
+
+ AFS_GLOCK();
}
/* Purge VM for a file when its callback is revoked.
ICL_TYPE_INT32, origDV.low, ICL_TYPE_INT32, avc->f.m.Length);
ReleaseWriteLock(&avc->lock);
-#ifndef AFS_FBSD_ENV
AFS_GUNLOCK();
-#endif
osi_VM_FlushPages(avc, credp);
-#ifndef AFS_FBSD_ENV
AFS_GLOCK();
-#endif
ObtainWriteLock(&avc->lock, 88);
/* do this last, and to original version, since stores may occur
if (!iheldthelock)
VOP_UNLOCK(vp, LK_EXCLUSIVE, current_proc());
# elif defined(AFS_FBSD_ENV)
+ AFS_GUNLOCK();
iheldthelock = VOP_ISLOCKED(vp);
if (!iheldthelock) {
- /* nosleep/sleep lock order reversal */
- int glocked = ISAFS_GLOCK();
- if (glocked)
- AFS_GUNLOCK();
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
- if (glocked)
- AFS_GLOCK();
}
vinvalbuf(vp, V_SAVE, PINOD, 0); /* changed late in 8.0-CURRENT */
if (!iheldthelock)
VOP_UNLOCK(vp, 0);
+ AFS_GLOCK();
# elif defined(AFS_OBSD_ENV)
iheldthelock = VOP_ISLOCKED(vp, curproc);
if (!iheldthelock)