Commit 47458802 authored by Al Viro's avatar Al Viro
Browse files

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
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -1878,8 +1878,6 @@ void proc_pid_evict_inode(struct proc_inode *ei)
		hlist_del_init_rcu(&ei->sibling_inodes);
		spin_unlock(&pid->lock);
	}

	put_pid(pid);
}

struct inode *proc_pid_make_inode(struct super_block *sb,
+8 −11
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@

static void proc_evict_inode(struct inode *inode)
{
	struct proc_dir_entry *de;
	struct ctl_table_header *head;
	struct proc_inode *ei = PROC_I(inode);

@@ -38,17 +37,8 @@ static void proc_evict_inode(struct inode *inode)
	clear_inode(inode);

	/* Stop tracking associated processes */
	if (ei->pid) {
	if (ei->pid)
		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;
	if (head) {
@@ -80,6 +70,13 @@ static struct inode *proc_alloc_inode(struct super_block *sb)

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));
}