diff options
author | rwatson <rwatson@FreeBSD.org> | 2009-05-27 09:41:58 +0000 |
---|---|---|
committer | rwatson <rwatson@FreeBSD.org> | 2009-05-27 09:41:58 +0000 |
commit | 5373be118dcfe5ac88cf92412bc89027dc354def (patch) | |
tree | a04a9d5d7ce423066ecf8df5f054e9ac251fd5a1 /sys/security/mac/mac_internal.h | |
parent | 6e1cb07c00e4d2ec529383b09d8f166eec355949 (diff) | |
download | FreeBSD-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.h | 31 |
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) |