Commit d718249b authored by Christian Brauner's avatar Christian Brauner
Browse files

pidfs: remove pidfs_pid_valid()

parent 804d6794
Loading
Loading
Loading
Loading
+0 −53
Original line number Diff line number Diff line
@@ -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());