The proc_inode_is_dead function might race with __unhash_process. This will result in a whole bunch of stale proc entries being cached. To prevent that, add the required locking.
Signed-off-by: Wen Yang <weny...@linux.alibaba.com> Cc: Oleg Nesterov <o...@redhat.com> Cc: "Eric W. Biederman" <ebied...@xmission.com> Cc: Alexey Dobriyan <adobri...@gmail.com> Cc: Christian Brauner <christ...@brauner.io> Cc: linux-kernel@vger.kernel.org Cc: linux-fsde...@vger.kernel.org --- fs/proc/base.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index 1bc9bcd..59720bc 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -1994,7 +1994,13 @@ static int pid_revalidate(struct dentry *dentry, unsigned int flags) static inline bool proc_inode_is_dead(struct inode *inode) { - return !proc_pid(inode)->tasks[PIDTYPE_PID].first; + bool has_task; + + read_lock(&tasklist_lock); + has_task = pid_has_task(proc_pid(inode), PIDTYPE_PID); + read_unlock(&tasklist_lock); + + return !has_task; } int pid_delete_dentry(const struct dentry *dentry) -- 1.8.3.1