mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 23:52:08 +02:00
pidfs: simplify PIDFD_GET_<type>_NAMESPACE ioctls
We have reworked namespaces sufficiently that all this special-casing shouldn't be needed anymore Link: https://patch.msgid.link/20251117-eidesstattlich-apotheke-36d2e644079f@brauner Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
cc7d6c65b8
commit
a71e4f103a
75
fs/pidfs.c
75
fs/pidfs.c
|
|
@ -454,7 +454,6 @@ static long pidfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
struct task_struct *task __free(put_task) = NULL;
|
struct task_struct *task __free(put_task) = NULL;
|
||||||
struct nsproxy *nsp __free(put_nsproxy) = NULL;
|
struct nsproxy *nsp __free(put_nsproxy) = NULL;
|
||||||
struct ns_common *ns_common = NULL;
|
struct ns_common *ns_common = NULL;
|
||||||
struct pid_namespace *pid_ns;
|
|
||||||
|
|
||||||
if (!pidfs_ioctl_valid(cmd))
|
if (!pidfs_ioctl_valid(cmd))
|
||||||
return -ENOIOCTLCMD;
|
return -ENOIOCTLCMD;
|
||||||
|
|
@ -496,66 +495,64 @@ static long pidfd_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
/* Namespaces that hang of nsproxy. */
|
/* Namespaces that hang of nsproxy. */
|
||||||
case PIDFD_GET_CGROUP_NAMESPACE:
|
case PIDFD_GET_CGROUP_NAMESPACE:
|
||||||
if (IS_ENABLED(CONFIG_CGROUPS)) {
|
if (!ns_ref_get(nsp->cgroup_ns))
|
||||||
get_cgroup_ns(nsp->cgroup_ns);
|
break;
|
||||||
ns_common = to_ns_common(nsp->cgroup_ns);
|
ns_common = to_ns_common(nsp->cgroup_ns);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PIDFD_GET_IPC_NAMESPACE:
|
case PIDFD_GET_IPC_NAMESPACE:
|
||||||
if (IS_ENABLED(CONFIG_IPC_NS)) {
|
if (!ns_ref_get(nsp->ipc_ns))
|
||||||
get_ipc_ns(nsp->ipc_ns);
|
break;
|
||||||
ns_common = to_ns_common(nsp->ipc_ns);
|
ns_common = to_ns_common(nsp->ipc_ns);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PIDFD_GET_MNT_NAMESPACE:
|
case PIDFD_GET_MNT_NAMESPACE:
|
||||||
get_mnt_ns(nsp->mnt_ns);
|
if (!ns_ref_get(nsp->mnt_ns))
|
||||||
|
break;
|
||||||
ns_common = to_ns_common(nsp->mnt_ns);
|
ns_common = to_ns_common(nsp->mnt_ns);
|
||||||
break;
|
break;
|
||||||
case PIDFD_GET_NET_NAMESPACE:
|
case PIDFD_GET_NET_NAMESPACE:
|
||||||
if (IS_ENABLED(CONFIG_NET_NS)) {
|
if (!ns_ref_get(nsp->net_ns))
|
||||||
ns_common = to_ns_common(nsp->net_ns);
|
break;
|
||||||
get_net_ns(ns_common);
|
ns_common = to_ns_common(nsp->net_ns);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE:
|
case PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE:
|
||||||
if (IS_ENABLED(CONFIG_PID_NS)) {
|
if (!ns_ref_get(nsp->pid_ns_for_children))
|
||||||
get_pid_ns(nsp->pid_ns_for_children);
|
break;
|
||||||
ns_common = to_ns_common(nsp->pid_ns_for_children);
|
ns_common = to_ns_common(nsp->pid_ns_for_children);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PIDFD_GET_TIME_NAMESPACE:
|
case PIDFD_GET_TIME_NAMESPACE:
|
||||||
if (IS_ENABLED(CONFIG_TIME_NS)) {
|
if (!ns_ref_get(nsp->time_ns))
|
||||||
get_time_ns(nsp->time_ns);
|
break;
|
||||||
ns_common = to_ns_common(nsp->time_ns);
|
ns_common = to_ns_common(nsp->time_ns);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE:
|
case PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE:
|
||||||
if (IS_ENABLED(CONFIG_TIME_NS)) {
|
if (!ns_ref_get(nsp->time_ns_for_children))
|
||||||
get_time_ns(nsp->time_ns_for_children);
|
break;
|
||||||
ns_common = to_ns_common(nsp->time_ns_for_children);
|
ns_common = to_ns_common(nsp->time_ns_for_children);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case PIDFD_GET_UTS_NAMESPACE:
|
case PIDFD_GET_UTS_NAMESPACE:
|
||||||
if (IS_ENABLED(CONFIG_UTS_NS)) {
|
if (!ns_ref_get(nsp->uts_ns))
|
||||||
get_uts_ns(nsp->uts_ns);
|
break;
|
||||||
ns_common = to_ns_common(nsp->uts_ns);
|
ns_common = to_ns_common(nsp->uts_ns);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
/* Namespaces that don't hang of nsproxy. */
|
/* Namespaces that don't hang of nsproxy. */
|
||||||
case PIDFD_GET_USER_NAMESPACE:
|
case PIDFD_GET_USER_NAMESPACE:
|
||||||
if (IS_ENABLED(CONFIG_USER_NS)) {
|
scoped_guard(rcu) {
|
||||||
rcu_read_lock();
|
struct user_namespace *user_ns;
|
||||||
ns_common = to_ns_common(get_user_ns(task_cred_xxx(task, user_ns)));
|
|
||||||
rcu_read_unlock();
|
user_ns = task_cred_xxx(task, user_ns);
|
||||||
|
if (!ns_ref_get(user_ns))
|
||||||
|
break;
|
||||||
|
ns_common = to_ns_common(user_ns);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PIDFD_GET_PID_NAMESPACE:
|
case PIDFD_GET_PID_NAMESPACE:
|
||||||
if (IS_ENABLED(CONFIG_PID_NS)) {
|
scoped_guard(rcu) {
|
||||||
rcu_read_lock();
|
struct pid_namespace *pid_ns;
|
||||||
|
|
||||||
pid_ns = task_active_pid_ns(task);
|
pid_ns = task_active_pid_ns(task);
|
||||||
if (pid_ns)
|
if (!ns_ref_get(pid_ns))
|
||||||
ns_common = to_ns_common(get_pid_ns(pid_ns));
|
break;
|
||||||
rcu_read_unlock();
|
ns_common = to_ns_common(pid_ns);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user