mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
pidfs: remove pidfs_{get,put}_pid()
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>
This commit is contained in:
@@ -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);
|
||||
|
||||
35
fs/pidfs.c
35
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,
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user