Merge tag 's390-5.7-1' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux
[linux-block.git] / fs / proc / proc_sysctl.c
index c75bb4632ed191c5f68198db556111581d9effff..b6f5d459b087de348a1f71a9ab08a7809552e36a 100644 (file)
@@ -267,42 +267,9 @@ static void unuse_table(struct ctl_table_header *p)
                        complete(p->unregistering);
 }
 
-static void proc_sys_prune_dcache(struct ctl_table_header *head)
+static void proc_sys_invalidate_dcache(struct ctl_table_header *head)
 {
-       struct inode *inode;
-       struct proc_inode *ei;
-       struct hlist_node *node;
-       struct super_block *sb;
-
-       rcu_read_lock();
-       for (;;) {
-               node = hlist_first_rcu(&head->inodes);
-               if (!node)
-                       break;
-               ei = hlist_entry(node, struct proc_inode, sysctl_inodes);
-               spin_lock(&sysctl_lock);
-               hlist_del_init_rcu(&ei->sysctl_inodes);
-               spin_unlock(&sysctl_lock);
-
-               inode = &ei->vfs_inode;
-               sb = inode->i_sb;
-               if (!atomic_inc_not_zero(&sb->s_active))
-                       continue;
-               inode = igrab(inode);
-               rcu_read_unlock();
-               if (unlikely(!inode)) {
-                       deactivate_super(sb);
-                       rcu_read_lock();
-                       continue;
-               }
-
-               d_prune_aliases(inode);
-               iput(inode);
-               deactivate_super(sb);
-
-               rcu_read_lock();
-       }
-       rcu_read_unlock();
+       proc_invalidate_siblings_dcache(&head->inodes, &sysctl_lock);
 }
 
 /* called under sysctl_lock, will reacquire if has to wait */
@@ -324,10 +291,10 @@ static void start_unregistering(struct ctl_table_header *p)
                spin_unlock(&sysctl_lock);
        }
        /*
-        * Prune dentries for unregistered sysctls: namespaced sysctls
+        * Invalidate dentries for unregistered sysctls: namespaced sysctls
         * can have duplicate names and contaminate dcache very badly.
         */
-       proc_sys_prune_dcache(p);
+       proc_sys_invalidate_dcache(p);
        /*
         * do not remove from the list until nobody holds it; walking the
         * list in do_sysctl() relies on that.
@@ -483,7 +450,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb,
        }
        ei->sysctl = head;
        ei->sysctl_entry = table;
-       hlist_add_head_rcu(&ei->sysctl_inodes, &head->inodes);
+       hlist_add_head_rcu(&ei->sibling_inodes, &head->inodes);
        head->count++;
        spin_unlock(&sysctl_lock);
 
@@ -514,7 +481,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb,
 void proc_sys_evict_inode(struct inode *inode, struct ctl_table_header *head)
 {
        spin_lock(&sysctl_lock);
-       hlist_del_init_rcu(&PROC_I(inode)->sysctl_inodes);
+       hlist_del_init_rcu(&PROC_I(inode)->sibling_inodes);
        if (!--head->count)
                kfree_rcu(head, rcu);
        spin_unlock(&sysctl_lock);