diff --git a/fs/nsfs.c b/fs/nsfs.c index ba6c8975c82e..ffe31c66d1d8 100644 --- a/fs/nsfs.c +++ b/fs/nsfs.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "mount.h" #include "internal.h" @@ -698,12 +699,20 @@ void nsproxy_ns_active_get(struct nsproxy *ns) void nsproxy_ns_active_put(struct nsproxy *ns) { - ns_ref_active_put(ns->mnt_ns); - ns_ref_active_put(ns->uts_ns); - ns_ref_active_put(ns->ipc_ns); - ns_ref_active_put(ns->pid_ns_for_children); - ns_ref_active_put(ns->cgroup_ns); - ns_ref_active_put(ns->net_ns); - ns_ref_active_put(ns->time_ns); - ns_ref_active_put(ns->time_ns_for_children); + if (ns->mnt_ns && !is_initial_namespace(&ns->mnt_ns->ns)) + ns_ref_active_put(ns->mnt_ns); + if (ns->uts_ns && !is_initial_namespace(&ns->uts_ns->ns)) + ns_ref_active_put(ns->uts_ns); + if (ns->ipc_ns && !is_initial_namespace(&ns->ipc_ns->ns)) + ns_ref_active_put(ns->ipc_ns); + if (ns->pid_ns_for_children && !is_initial_namespace(&ns->pid_ns_for_children->ns)) + ns_ref_active_put(ns->pid_ns_for_children); + if (ns->cgroup_ns && !is_initial_namespace(&ns->cgroup_ns->ns)) + ns_ref_active_put(ns->cgroup_ns); + if (ns->net_ns && !is_initial_namespace(&ns->net_ns->ns)) + ns_ref_active_put(ns->net_ns); + if (ns->time_ns && !is_initial_namespace(&ns->time_ns->ns)) + ns_ref_active_put(ns->time_ns); + if (ns->time_ns_for_children && !is_initial_namespace(&ns->time_ns_for_children->ns)) + ns_ref_active_put(ns->time_ns_for_children); }