Merge branch 'master' of git://git.infradead.org/users/eparis/selinux into next
[linux-flexiantxendom0-natty.git] / security / selinux / selinuxfs.c
index 45d35e6..ea39cb7 100644 (file)
@@ -1149,24 +1149,28 @@ static void sel_remove_entries(struct dentry *de)
 {
        struct list_head *node;
 
-       spin_lock(&dcache_lock);
+       spin_lock(&de->d_lock);
        node = de->d_subdirs.next;
        while (node != &de->d_subdirs) {
                struct dentry *d = list_entry(node, struct dentry, d_u.d_child);
+
+               spin_lock_nested(&d->d_lock, DENTRY_D_LOCK_NESTED);
                list_del_init(node);
 
                if (d->d_inode) {
-                       d = dget_locked(d);
-                       spin_unlock(&dcache_lock);
+                       dget_dlock(d);
+                       spin_unlock(&de->d_lock);
+                       spin_unlock(&d->d_lock);
                        d_delete(d);
                        simple_unlink(de->d_inode, d);
                        dput(d);
-                       spin_lock(&dcache_lock);
-               }
+                       spin_lock(&de->d_lock);
+               } else
+                       spin_unlock(&d->d_lock);
                node = de->d_subdirs.next;
        }
 
-       spin_unlock(&dcache_lock);
+       spin_unlock(&de->d_lock);
 }
 
 #define BOOL_DIR_NAME "booleans"