Am Mi., 18. Juni 2025 um 22:54 Uhr schrieb Christian Brauner <brauner@xxxxxxxxxx>: > > 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. > > Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx> Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@xxxxxxxxxxxxx> > --- > fs/coredump.c | 6 ------ > fs/pidfs.c | 35 +---------------------------------- > include/linux/pidfs.h | 2 -- > net/unix/af_unix.c | 5 ----- > 4 files changed, 1 insertion(+), 47 deletions(-) > > diff --git a/fs/coredump.c b/fs/coredump.c > index f217ebf2b3b6..55d6a713a0fb 100644 > --- a/fs/coredump.c > +++ b/fs/coredump.c > @@ -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); > diff --git a/fs/pidfs.c b/fs/pidfs.c > index c49c53d6ae51..bc2342cf4492 100644 > --- a/fs/pidfs.c > +++ b/fs/pidfs.c > @@ -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, > diff --git a/include/linux/pidfs.h b/include/linux/pidfs.h > index 8f6ed59bb3fb..3e08c33da2df 100644 > --- a/include/linux/pidfs.h > +++ b/include/linux/pidfs.h > @@ -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 */ > diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c > index 2e2e9997a68e..129388c309b0 100644 > --- a/net/unix/af_unix.c > +++ b/net/unix/af_unix.c > @@ -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); > } > > -- > 2.47.2 >