summaryrefslogtreecommitdiffstats
path: root/sys/security/mac/mac_internal.h
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2009-05-27 09:41:58 +0000
committerrwatson <rwatson@FreeBSD.org>2009-05-27 09:41:58 +0000
commit5373be118dcfe5ac88cf92412bc89027dc354def (patch)
treea04a9d5d7ce423066ecf8df5f054e9ac251fd5a1 /sys/security/mac/mac_internal.h
parent6e1cb07c00e4d2ec529383b09d8f166eec355949 (diff)
downloadFreeBSD-src-5373be118dcfe5ac88cf92412bc89027dc354def.zip
FreeBSD-src-5373be118dcfe5ac88cf92412bc89027dc354def.tar.gz
Convert the MAC Framework from using rwlocks to rmlocks to stabilize
framework registration for non-sleepable entry points. Obtained from: TrustedBSD Project
Diffstat (limited to 'sys/security/mac/mac_internal.h')
-rw-r--r--sys/security/mac/mac_internal.h31
1 files changed, 21 insertions, 10 deletions
diff --git a/sys/security/mac/mac_internal.h b/sys/security/mac/mac_internal.h
index 5099e97..45bd524 100644
--- a/sys/security/mac/mac_internal.h
+++ b/sys/security/mac/mac_internal.h
@@ -55,6 +55,9 @@
#error "no user-serviceable parts inside"
#endif
+#include <sys/lock.h>
+#include <sys/rmlock.h>
+
/*
* MAC Framework sysctl namespace.
*/
@@ -194,9 +197,9 @@ extern struct mtx mac_ifnet_mtx;
*/
int mac_error_select(int error1, int error2);
-void mac_policy_slock_nosleep(void);
+void mac_policy_slock_nosleep(struct rm_priotracker *tracker);
void mac_policy_slock_sleep(void);
-void mac_policy_sunlock_nosleep(void);
+void mac_policy_sunlock_nosleep(struct rm_priotracker *tracker);
void mac_policy_sunlock_sleep(void);
struct label *mac_labelzone_alloc(int flags);
@@ -294,14 +297,16 @@ int vn_setlabel(struct vnode *vp, struct label *intlabel,
error); \
} \
if (!LIST_EMPTY(&mac_policy_list)) { \
- mac_policy_slock_nosleep(); \
+ struct rm_priotracker tracker; \
+ \
+ mac_policy_slock_nosleep(&tracker); \
LIST_FOREACH(mpc, &mac_policy_list, mpc_list) { \
if (mpc->mpc_ops->mpo_ ## check != NULL) \
error = mac_error_select( \
mpc->mpc_ops->mpo_ ## check (args), \
error); \
} \
- mac_policy_sunlock_nosleep(); \
+ mac_policy_sunlock_nosleep(&tracker); \
} \
} while (0)
@@ -323,7 +328,9 @@ int vn_setlabel(struct vnode *vp, struct label *intlabel,
} \
} \
if (!LIST_EMPTY(&mac_policy_list)) { \
- mac_policy_slock_nosleep(); \
+ struct rm_priotracker tracker; \
+ \
+ mac_policy_slock_nosleep(&tracker); \
LIST_FOREACH(mpc, &mac_policy_list, mpc_list) { \
if (mpc->mpc_ops->mpo_ ## check != NULL) { \
if (mpc->mpc_ops->mpo_ ## check (args) \
@@ -331,7 +338,7 @@ int vn_setlabel(struct vnode *vp, struct label *intlabel,
error = 0; \
} \
} \
- mac_policy_sunlock_nosleep(); \
+ mac_policy_sunlock_nosleep(&tracker); \
} \
} while (0)
@@ -371,14 +378,16 @@ int vn_setlabel(struct vnode *vp, struct label *intlabel,
mpc->mpc_ops->mpo_ ## operation (args); \
} \
if (!LIST_EMPTY(&mac_policy_list)) { \
- mac_policy_slock_nosleep(); \
+ struct rm_priotracker tracker; \
+ \
+ mac_policy_slock_nosleep(&tracker); \
LIST_FOREACH(mpc, &mac_policy_list, mpc_list) { \
if (mpc->mpc_ops->mpo_ ## operation != NULL) \
result = result composition \
mpc->mpc_ops->mpo_ ## operation \
(args); \
} \
- mac_policy_sunlock_nosleep(); \
+ mac_policy_sunlock_nosleep(&tracker); \
} \
} while (0)
@@ -492,12 +501,14 @@ int vn_setlabel(struct vnode *vp, struct label *intlabel,
mpc->mpc_ops->mpo_ ## operation (args); \
} \
if (!LIST_EMPTY(&mac_policy_list)) { \
- mac_policy_slock_nosleep(); \
+ struct rm_priotracker tracker; \
+ \
+ mac_policy_slock_nosleep(&tracker); \
LIST_FOREACH(mpc, &mac_policy_list, mpc_list) { \
if (mpc->mpc_ops->mpo_ ## operation != NULL) \
mpc->mpc_ops->mpo_ ## operation (args); \
} \
- mac_policy_sunlock_nosleep(); \
+ mac_policy_sunlock_nosleep(&tracker); \
} \
} while (0)
OpenPOWER on IntegriCloud