OpenBSD: Clean up use of LK_CANRECURSE in call to lockmgr()
authorAntoine Verheijen <apv@ualberta.ca>
Wed, 28 Jan 2015 02:49:04 +0000 (19:49 -0700)
committerBenjamin Kaduk <kaduk@mit.edu>
Thu, 29 Jan 2015 19:34:15 +0000 (14:34 -0500)
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>

src/afs/OBSD/osi_vnodeops.c

index 022504e..35799f2 100644 (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