aboutsummaryrefslogtreecommitdiffstats
path: root/security/selinux
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2011-01-07 11:56:33 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-07 11:56:33 -0500
commitb4a45f5fe8078bfc10837dbd5b98735058bc4698 (patch)
treedf6f13a27610a3ec7eb4a661448cd779a8f84c79 /security/selinux
parent01539ba2a706ab7d35fc0667dff919ade7f87d63 (diff)
parentb3e19d924b6eaf2ca7d22cba99a517c5171007b6 (diff)
Merge branch 'vfs-scale-working' of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin
* 'vfs-scale-working' of git://git.kernel.org/pub/scm/linux/kernel/git/npiggin/linux-npiggin: (57 commits) fs: scale mntget/mntput fs: rename vfsmount counter helpers fs: implement faster dentry memcmp fs: prefetch inode data in dcache lookup fs: improve scalability of pseudo filesystems fs: dcache per-inode inode alias locking fs: dcache per-bucket dcache hash locking bit_spinlock: add required includes kernel: add bl_list xfs: provide simple rcu-walk ACL implementation btrfs: provide simple rcu-walk ACL implementation ext2,3,4: provide simple rcu-walk ACL implementation fs: provide simple rcu-walk generic_check_acl implementation fs: provide rcu-walk aware permission i_ops fs: rcu-walk aware d_revalidate method fs: cache optimise dentry and inode for rcu-walk fs: dcache reduce branches in lookup path fs: dcache remove d_mounted fs: fs_struct use seqlock fs: rcu-walk for path lookup ...
Diffstat (limited to 'security/selinux')
-rw-r--r--security/selinux/selinuxfs.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
index 073fd5b0a53a..43deac219491 100644
--- a/security/selinux/selinuxfs.c
+++ b/security/selinux/selinuxfs.c
@@ -1145,24 +1145,28 @@ static void sel_remove_entries(struct dentry *de)
1145{ 1145{
1146 struct list_head *node; 1146 struct list_head *node;
1147 1147
1148 spin_lock(&dcache_lock); 1148 spin_lock(&de->d_lock);
1149 node = de->d_subdirs.next; 1149 node = de->d_subdirs.next;
1150 while (node != &de->d_subdirs) { 1150 while (node != &de->d_subdirs) {
1151 struct dentry *d = list_entry(node, struct dentry, d_u.d_child); 1151 struct dentry *d = list_entry(node, struct dentry, d_u.d_child);
1152
1153 spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
1152 list_del_init(node); 1154 list_del_init(node);
1153 1155
1154 if (d->d_inode) { 1156 if (d->d_inode) {
1155 d = dget_locked(d); 1157 dget_dlock(d);
1156 spin_unlock(&dcache_lock); 1158 spin_unlock(&de->d_lock);
1159 spin_unlock(&d->d_lock);
1157 d_delete(d); 1160 d_delete(d);
1158 simple_unlink(de->d_inode, d); 1161 simple_unlink(de->d_inode, d);
1159 dput(d); 1162 dput(d);
1160 spin_lock(&dcache_lock); 1163 spin_lock(&de->d_lock);
1161 } 1164 } else
1165 spin_unlock(&d->d_lock);
1162 node = de->d_subdirs.next; 1166 node = de->d_subdirs.next;
1163 } 1167 }
1164 1168
1165 spin_unlock(&dcache_lock); 1169 spin_unlock(&de->d_lock);
1166} 1170}
1167 1171
1168#define BOOL_DIR_NAME "booleans" 1172#define BOOL_DIR_NAME "booleans"