OpenBSD: Clean up use of LK_CANRECURSE in call to lockmgr()

The LK_CANRECURSE and LK_RECURSEFAIL flags in the call to lockmgr()
are mutually exclusive. Previous version of OpenBSD didn't really
check well for this but more recent versions look for the conflict
and take a kernel panic when they're both set.

The OpenBSD kernel module currently just blindly sets the
LK_CANRECURSE flag in its call to lockmgr(). This patch changes
that behaviour so that it checks to make sure that the LK_RECURSEFAIL
flags is not set before it actually applies the LK_CANRECURSE flag.
That removes the kernel panics that have started to arise.

This behaviour is more consistent with other OpenBSD code that makes
use of the LK_CANRECURSE flag.

Change-Id: Ie435559f4b88195136e09c6184543861f06257da
Reviewed-on: http://gerrit.openafs.org/11699
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Perry Ruiter <pruiter@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
This commit is contained in:
Antoine Verheijen 2015-01-27 19:49:04 -07:00 committed by Benjamin Kaduk
parent d354386b8c
commit 40d97fa9f0

View File

@ -978,7 +978,9 @@ afs_obsd_lock(void *v)
if (!vc)
panic("afs_obsd_lock: null vcache");
return afs_osi_lockmgr(&vc->rwlock, ap->a_flags | LK_CANRECURSE, VP_INTERLOCK, ap->a_p);
return afs_osi_lockmgr(&vc->rwlock,
(ap->a_flags & LK_RECURSEFAIL) ? ap->a_flags : ap->a_flags | LK_CANRECURSE,
VP_INTERLOCK, ap->a_p);
}
int