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: Christian Brauner <brauner@kernel.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
c1b967d03c
commit
47458802f6
|
@ -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 @@
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue