diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2020-02-20 18:17:28 +0100 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2020-02-24 16:51:25 +0100 |
commit | 71448011ea2a1cd36d8f5cbdab0ed716c454d565 (patch) | |
tree | 929506f14014c7c827eeb46c8e9aa3d6368f7473 /fs/proc | |
parent | proc: Use d_invalidate in proc_prune_siblings_dcache (diff) | |
download | linux-71448011ea2a1cd36d8f5cbdab0ed716c454d565.tar.xz linux-71448011ea2a1cd36d8f5cbdab0ed716c454d565.zip |
proc: Clear the pieces of proc_inode that proc_evict_inode cares about
This just keeps everything tidier, and allows for using flags like
SLAB_TYPESAFE_BY_RCU where slabs are not always cleared before reuse.
I don't see reuse without reinitializing happening with the proc_inode
but I had a false alarm while reworking flushing of proc dentries and
indoes when a process dies that caused me to tidy this up.
The code is a little easier to follow and reason about this
way so I figured the changes might as well be kept.
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Diffstat (limited to 'fs/proc')
-rw-r--r-- | fs/proc/inode.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/fs/proc/inode.c b/fs/proc/inode.c index ba6acd300ce1..d9243b24554a 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -33,21 +33,27 @@ 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); truncate_inode_pages_final(&inode->i_data); clear_inode(inode); /* Stop tracking associated processes */ - put_pid(PROC_I(inode)->pid); + if (ei->pid) { + put_pid(ei->pid); + ei->pid = NULL; + } /* Let go of any associated proc directory entry */ - de = PDE(inode); - if (de) + de = ei->pde; + if (de) { pde_put(de); + ei->pde = NULL; + } - head = PROC_I(inode)->sysctl; + head = ei->sysctl; if (head) { - RCU_INIT_POINTER(PROC_I(inode)->sysctl, NULL); + RCU_INIT_POINTER(ei->sysctl, NULL); proc_sys_evict_inode(inode, head); } } |