proc: Clear the pieces of proc_inode that proc_evict_inode cares about
authorEric W. Biederman <ebiederm@xmission.com>
Thu, 20 Feb 2020 17:17:28 +0000 (11:17 -0600)
committerEric W. Biederman <ebiederm@xmission.com>
Mon, 24 Feb 2020 15:51:25 +0000 (09:51 -0600)
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>
fs/proc/inode.c

index ba6acd3..d9243b2 100644 (file)
@@ -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);
        }
 }