pidfs: remove pidfs_pid_valid()
authorChristian Brauner <brauner@kernel.org>
Wed, 18 Jun 2025 20:53:43 +0000 (22:53 +0200)
committerChristian Brauner <brauner@kernel.org>
Thu, 19 Jun 2025 12:28:25 +0000 (14:28 +0200)
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>
fs/pidfs.c

index bc2342cf44929cdf37c62d8deddc288e9665e008..ec375692a710c805bcb3011316061d92752e8439 100644 (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());