pidfs: remove pidfs_{get,put}_pid()
authorChristian Brauner <brauner@kernel.org>
Wed, 18 Jun 2025 20:53:42 +0000 (22:53 +0200)
committerChristian Brauner <brauner@kernel.org>
Thu, 19 Jun 2025 12:28:24 +0000 (14:28 +0200)
Now that we stash persistent information in struct pid there's no need
to play volatile games with pinning struct pid via dentries in pidfs.

Link: https://lore.kernel.org/20250618-work-pidfs-persistent-v2-8-98f3456fd552@kernel.org
Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/coredump.c
fs/pidfs.c
include/linux/pidfs.h
net/unix/af_unix.c

index f217ebf2b3b68f4ae918090c777e0131132db349..55d6a713a0fb0859c01ddb756b587a2d496eb3e2 100644 (file)
@@ -898,12 +898,6 @@ void do_coredump(const kernel_siginfo_t *siginfo)
                retval = kernel_connect(socket, (struct sockaddr *)(&addr),
                                        addr_len, O_NONBLOCK | SOCK_COREDUMP);
 
-               /*
-                * ... Make sure to only put our reference after connect() took
-                * its own reference keeping the pidfs entry alive ...
-                */
-               pidfs_put_pid(cprm.pid);
-
                if (retval) {
                        if (retval == -EAGAIN)
                                coredump_report_failure("Coredump socket %s receive queue full", addr.sun_path);
index c49c53d6ae519482c33df42a82f19798977b3992..bc2342cf44929cdf37c62d8deddc288e9665e008 100644 (file)
@@ -895,8 +895,7 @@ static void pidfs_put_data(void *data)
  * pidfs_register_pid - register a struct pid in pidfs
  * @pid: pid to pin
  *
- * Register a struct pid in pidfs. Needs to be paired with
- * pidfs_put_pid() to not risk leaking the pidfs dentry and inode.
+ * Register a struct pid in pidfs.
  *
  * Return: On success zero, on error a negative error code is returned.
  */
@@ -1007,38 +1006,6 @@ struct file *pidfs_alloc_file(struct pid *pid, unsigned int flags)
        return pidfd_file;
 }
 
-/**
- * pidfs_get_pid - pin a struct pid through pidfs
- * @pid: pid to pin
- *
- * Similar to pidfs_register_pid() but only valid if the caller knows
- * there's a reference to the @pid through a dentry already that can't
- * go away.
- */
-void pidfs_get_pid(struct pid *pid)
-{
-       if (!pid)
-               return;
-       WARN_ON_ONCE(!stashed_dentry_get(&pid->stashed));
-}
-
-/**
- * pidfs_put_pid - drop a pidfs reference
- * @pid: pid to drop
- *
- * Drop a reference to @pid via pidfs. This is only safe if the
- * reference has been taken via pidfs_get_pid().
- */
-void pidfs_put_pid(struct pid *pid)
-{
-       might_sleep();
-
-       if (!pid)
-               return;
-       VFS_WARN_ON_ONCE(!pid->stashed);
-       dput(pid->stashed);
-}
-
 void __init pidfs_init(void)
 {
        pidfs_attr_cachep = kmem_cache_create("pidfs_attr_cache", sizeof(struct pidfs_attr), 0,
index 8f6ed59bb3fb69969d826a1592ac68fb0330f8f2..3e08c33da2df05eff1eefdbf4778f01932e9fbd6 100644 (file)
@@ -14,8 +14,6 @@ void pidfs_coredump(const struct coredump_params *cprm);
 #endif
 extern const struct dentry_operations pidfs_dentry_operations;
 int pidfs_register_pid(struct pid *pid);
-void pidfs_get_pid(struct pid *pid);
-void pidfs_put_pid(struct pid *pid);
 void pidfs_free_pid(struct pid *pid);
 
 #endif /* _LINUX_PID_FS_H */
index 2e2e9997a68e71177cc54016c56e0f42114b2527..129388c309b0d5a4370bb686c31ec7e326eb05c2 100644 (file)
@@ -646,9 +646,6 @@ static void unix_sock_destructor(struct sock *sk)
                return;
        }
 
-       if (sk->sk_peer_pid)
-               pidfs_put_pid(sk->sk_peer_pid);
-
        if (u->addr)
                unix_release_addr(u->addr);
 
@@ -769,7 +766,6 @@ static void drop_peercred(struct unix_peercred *peercred)
        swap(peercred->peer_pid, pid);
        swap(peercred->peer_cred, cred);
 
-       pidfs_put_pid(pid);
        put_pid(pid);
        put_cred(cred);
 }
@@ -802,7 +798,6 @@ static void copy_peercred(struct sock *sk, struct sock *peersk)
 
        spin_lock(&sk->sk_peer_lock);
        sk->sk_peer_pid = get_pid(peersk->sk_peer_pid);
-       pidfs_get_pid(sk->sk_peer_pid);
        sk->sk_peer_cred = get_cred(peersk->sk_peer_cred);
        spin_unlock(&sk->sk_peer_lock);
 }