[apparmor] [PATCH 16/36] apparmor: update compatibility patch for RCU locking
John Johansen
john.johansen at canonical.com
Wed May 1 21:31:01 UTC 2013
Signed-off-by: John Johansen <john.johansen at canonical.com>
---
security/apparmor/apparmorfs.c | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
index e33a4c5..6d0f0f8 100644
--- a/security/apparmor/apparmorfs.c
+++ b/security/apparmor/apparmorfs.c
@@ -20,6 +20,7 @@
#include <linux/uaccess.h>
#include <linux/namei.h>
#include <linux/capability.h>
+#include <linux/rcupdate.h>
#include "include/apparmor.h"
#include "include/apparmorfs.h"
@@ -531,16 +532,16 @@ static struct aa_namespace *__next_namespace(struct aa_namespace *root,
if (!list_empty(&ns->sub_ns)) {
struct aa_namespace *next;
next = list_first_entry(&ns->sub_ns, typeof(*ns), base.list);
- read_lock(&next->lock);
+ mutex_lock(&next->lock);
return next;
}
/* check if the next ns is a sibling, parent, gp, .. */
parent = ns->parent;
while (parent) {
- read_unlock(&ns->lock);
+ mutex_unlock(&ns->lock);
list_for_each_entry_continue(ns, &parent->sub_ns, base.list) {
- read_lock(&ns->lock);
+ mutex_lock(&ns->lock);
return ns;
}
if (parent == root)
@@ -590,13 +591,13 @@ static struct aa_profile *__next_profile(struct aa_profile *p)
base.list);
/* is next profile a sibling, parent sibling, gp, subling, .. */
- parent = p->parent;
+ parent = rcu_dereference_protected(p->parent, mutex_is_locked(&p->ns->lock));
while (parent) {
list_for_each_entry_continue(p, &parent->base.profiles,
base.list)
return p;
p = parent;
- parent = parent->parent;
+ parent = rcu_dereference_protected(parent->parent, mutex_is_locked(&parent->ns->lock));
}
/* is next another profile in the namespace */
@@ -643,7 +644,7 @@ static void *p_start(struct seq_file *f, loff_t *pos)
/* find the first profile */
- read_lock(&root->lock);
+ mutex_lock(&root->lock);
profile = __first_profile(root, root);
/* skip to position */
@@ -687,9 +688,9 @@ static void p_stop(struct seq_file *f, void *p)
if (profile) {
for (ns = profile->ns; ns && ns != root; ns = ns->parent)
- read_unlock(&ns->lock);
+ mutex_unlock(&ns->lock);
}
- read_unlock(&root->lock);
+ mutex_unlock(&root->lock);
aa_put_namespace(root);
}
--
1.8.1.2
More information about the AppArmor
mailing list