pidfs: remove pidfs_pid_valid()

The validation is now completely handled in path_from_stashed().

Link: https://lore.kernel.org/20250618-work-pidfs-persistent-v2-9-98f3456fd552@kernel.org
Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
Christian Brauner 2025-06-18 22:53:43 +02:00
parent 804d679449
commit d718249bba

View File

@ -804,58 +804,8 @@ static int pidfs_export_permission(struct handle_to_path_ctx *ctx,
return 0;
}
static inline bool pidfs_pid_valid(struct pid *pid, const struct path *path,
unsigned int flags)
{
enum pid_type type;
if (flags & PIDFD_STALE)
return true;
/*
* Make sure that if a pidfd is created PIDFD_INFO_EXIT
* information will be available. So after an inode for the
* pidfd has been allocated perform another check that the pid
* is still alive. If it is exit information is available even
* if the task gets reaped before the pidfd is returned to
* userspace. The only exception are indicated by PIDFD_STALE:
*
* (1) The kernel is in the middle of task creation and thus no
* task linkage has been established yet.
* (2) The caller knows @pid has been registered in pidfs at a
* time when the task was still alive.
*
* In both cases exit information will have been reported.
*/
if (flags & PIDFD_THREAD)
type = PIDTYPE_PID;
else
type = PIDTYPE_TGID;
/*
* Since pidfs_exit() is called before struct pid's task linkage
* is removed the case where the task got reaped but a dentry
* was already attached to struct pid and exit information was
* recorded and published can be handled correctly.
*/
if (unlikely(!pid_has_task(pid, type))) {
struct pidfs_attr *attr;
attr = READ_ONCE(pid->attr);
if (!attr)
return false;
if (!READ_ONCE(attr->exit_info))
return false;
}
return true;
}
static struct file *pidfs_export_open(struct path *path, unsigned int oflags)
{
if (!pidfs_pid_valid(d_inode(path->dentry)->i_private, path, oflags))
return ERR_PTR(-ESRCH);
/*
* Clear O_LARGEFILE as open_by_handle_at() forces it and raise
* O_RDWR as pidfds always are.
@ -993,9 +943,6 @@ struct file *pidfs_alloc_file(struct pid *pid, unsigned int flags)
if (ret < 0)
return ERR_PTR(ret);
if (!pidfs_pid_valid(pid, &path, flags))
return ERR_PTR(-ESRCH);
flags &= ~PIDFD_STALE;
flags |= O_RDWR;
pidfd_file = dentry_open(&path, flags, current_cred());