int copy_namespaces(int flags, struct task_struct *tsk);
 void get_task_namespaces(struct task_struct *tsk);
 void free_nsproxy(struct nsproxy *ns);
-struct nsproxy *put_nsproxy(struct nsproxy *ns);
 
-static inline void finalize_put_nsproxy(struct nsproxy *ns)
+static inline void put_nsproxy(struct nsproxy *ns)
 {
-       if (ns)
+       if (atomic_dec_and_test(&ns->count)) {
                free_nsproxy(ns);
+       }
 }
 
-static inline void put_and_finalize_nsproxy(struct nsproxy *ns)
+static inline void exit_task_namespaces(struct task_struct *p)
 {
-       finalize_put_nsproxy(put_nsproxy(ns));
-}
-
-static inline struct nsproxy *preexit_task_namespaces(struct task_struct *p)
-{
-       return put_nsproxy(p->nsproxy);
-}
-
-static inline void exit_task_namespaces(struct task_struct *p,
-                                               struct nsproxy *ns)
-{
-       task_lock(p);
-       p->nsproxy = NULL;
-       task_unlock(p);
-       finalize_put_nsproxy(ns);
+       struct nsproxy *ns = p->nsproxy;
+       if (ns) {
+               task_lock(p);
+               p->nsproxy = NULL;
+               task_unlock(p);
+               put_nsproxy(ns);
+       }
 }
 #endif
 
        current->fs = fs;
        atomic_inc(&fs->count);
 
-       put_and_finalize_nsproxy(current->nsproxy);
+       exit_task_namespaces(current);
        current->nsproxy = init_task.nsproxy;
        get_task_namespaces(current);
 
 fastcall NORET_TYPE void do_exit(long code)
 {
        struct task_struct *tsk = current;
-       struct nsproxy *ns;
        int group_dead;
 
        profile_task_exit(tsk);
 
        tsk->exit_code = code;
        proc_exit_connector(tsk);
-       ns = preexit_task_namespaces(tsk);
        exit_notify(tsk);
-       exit_task_namespaces(tsk, ns);
+       exit_task_namespaces(tsk);
 #ifdef CONFIG_NUMA
        mpol_free(tsk->mempolicy);
        tsk->mempolicy = NULL;
 
        return p;
 
 bad_fork_cleanup_namespaces:
-       put_and_finalize_nsproxy(p->nsproxy);
+       exit_task_namespaces(p);
 bad_fork_cleanup_keys:
        exit_keys(p);
 bad_fork_cleanup_mm:
        }
 
        if (new_nsproxy)
-               put_and_finalize_nsproxy(new_nsproxy);
+               put_nsproxy(new_nsproxy);
 
 bad_unshare_cleanup_ipc:
        if (new_ipc)
 
                goto out_pid;
 
 out:
-       put_and_finalize_nsproxy(old_ns);
+       put_nsproxy(old_ns);
        return err;
 
 out_pid:
        goto out;
 }
 
-struct nsproxy *put_nsproxy(struct nsproxy *ns)
-{
-       if (ns) {
-               if (atomic_dec_and_test(&ns->count)) {
-                       if (ns->mnt_ns) {
-                               put_mnt_ns(ns->mnt_ns);
-                               ns->mnt_ns = NULL;
-                       }
-                       return ns;
-               }
-       }
-       return NULL;
-}
-
 void free_nsproxy(struct nsproxy *ns)
 {
        if (ns->mnt_ns)