Commit 47458802 authored by Al Viro's avatar Al Viro

procfs: move dropping pde and pid from ->evict_inode() to ->free_inode()

that keeps both around until struct inode is freed, making access
to them safe from rcu-pathwalk
Acked-by: default avatarChristian Brauner <brauner@kernel.org>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent c1b967d0
...@@ -1878,8 +1878,6 @@ void proc_pid_evict_inode(struct proc_inode *ei) ...@@ -1878,8 +1878,6 @@ void proc_pid_evict_inode(struct proc_inode *ei)
hlist_del_init_rcu(&ei->sibling_inodes); hlist_del_init_rcu(&ei->sibling_inodes);
spin_unlock(&pid->lock); spin_unlock(&pid->lock);
} }
put_pid(pid);
} }
struct inode *proc_pid_make_inode(struct super_block *sb, struct inode *proc_pid_make_inode(struct super_block *sb,
......
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
static void proc_evict_inode(struct inode *inode) static void proc_evict_inode(struct inode *inode)
{ {
struct proc_dir_entry *de;
struct ctl_table_header *head; struct ctl_table_header *head;
struct proc_inode *ei = PROC_I(inode); struct proc_inode *ei = PROC_I(inode);
...@@ -38,17 +37,8 @@ static void proc_evict_inode(struct inode *inode) ...@@ -38,17 +37,8 @@ static void proc_evict_inode(struct inode *inode)
clear_inode(inode); clear_inode(inode);
/* Stop tracking associated processes */ /* Stop tracking associated processes */
if (ei->pid) { if (ei->pid)
proc_pid_evict_inode(ei); proc_pid_evict_inode(ei);
ei->pid = NULL;
}
/* Let go of any associated proc directory entry */
de = ei->pde;
if (de) {
pde_put(de);
ei->pde = NULL;
}
head = ei->sysctl; head = ei->sysctl;
if (head) { if (head) {
...@@ -80,6 +70,13 @@ static struct inode *proc_alloc_inode(struct super_block *sb) ...@@ -80,6 +70,13 @@ static struct inode *proc_alloc_inode(struct super_block *sb)
static void proc_free_inode(struct inode *inode) static void proc_free_inode(struct inode *inode)
{ {
struct proc_inode *ei = PROC_I(inode);
if (ei->pid)
put_pid(ei->pid);
/* Let go of any associated proc directory entry */
if (ei->pde)
pde_put(ei->pde);
kmem_cache_free(proc_inode_cachep, PROC_I(inode)); kmem_cache_free(proc_inode_cachep, PROC_I(inode));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment