Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=444f378b237a0f728f5c4aba752c08d13c209344
Commit:     444f378b237a0f728f5c4aba752c08d13c209344
Parent:     8c8c4bafc3a20a6fb9078315ff865bc42276f9ba
Author:     Linus Torvalds <[EMAIL PROTECTED]>
AuthorDate: Tue Jan 30 13:35:18 2007 -0800
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Tue Jan 30 13:35:18 2007 -0800

    Revert "[PATCH] namespaces: fix exit race by splitting exit"
    
    This reverts commit 7a238fcba0629b6f2edbcd37458bae56fcf36be5 in
    preparation for a better and simpler fix proposed by Eric Biederman
    (and fixed up by Serge Hallyn)
    
    Acked-by: Serge E. Hallyn <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 include/linux/nsproxy.h |   30 +++++++++++-------------------
 kernel/exit.c           |    6 ++----
 kernel/fork.c           |    4 ++--
 kernel/nsproxy.c        |   16 +---------------
 4 files changed, 16 insertions(+), 40 deletions(-)

diff --git a/include/linux/nsproxy.h b/include/linux/nsproxy.h
index 678e1d3..0b9f0dc 100644
--- a/include/linux/nsproxy.h
+++ b/include/linux/nsproxy.h
@@ -35,30 +35,22 @@ struct nsproxy *dup_namespaces(struct nsproxy *orig);
 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
diff --git a/kernel/exit.c b/kernel/exit.c
index a5bf532..3540172 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -396,7 +396,7 @@ void daemonize(const char *name, ...)
        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);
 
@@ -853,7 +853,6 @@ static void exit_notify(struct task_struct *tsk)
 fastcall NORET_TYPE void do_exit(long code)
 {
        struct task_struct *tsk = current;
-       struct nsproxy *ns;
        int group_dead;
 
        profile_task_exit(tsk);
@@ -939,9 +938,8 @@ fastcall NORET_TYPE void do_exit(long code)
 
        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;
diff --git a/kernel/fork.c b/kernel/fork.c
index 4cf8684..fc723e5 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1265,7 +1265,7 @@ static struct task_struct *copy_process(unsigned long 
clone_flags,
        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:
@@ -1711,7 +1711,7 @@ asmlinkage long sys_unshare(unsigned long unshare_flags)
        }
 
        if (new_nsproxy)
-               put_and_finalize_nsproxy(new_nsproxy);
+               put_nsproxy(new_nsproxy);
 
 bad_unshare_cleanup_ipc:
        if (new_ipc)
diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c
index 7b05bce..f5b9ee6 100644
--- a/kernel/nsproxy.c
+++ b/kernel/nsproxy.c
@@ -117,7 +117,7 @@ int copy_namespaces(int flags, struct task_struct *tsk)
                goto out_pid;
 
 out:
-       put_and_finalize_nsproxy(old_ns);
+       put_nsproxy(old_ns);
        return err;
 
 out_pid:
@@ -135,20 +135,6 @@ out_ns:
        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)
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to