kmem_cache_free(sighand_cachep, newsighand);
                return -EAGAIN;
        }
+
+       /*
+        * child_reaper ignores SIGKILL, change it now.
+        * Reparenting needs write_lock on tasklist_lock,
+        * so it is safe to do it under read_lock.
+        */
+       if (unlikely(current->group_leader == child_reaper))
+               child_reaper = current;
+
        zap_other_threads(current);
        read_unlock(&tasklist_lock);
 
                struct dentry *proc_dentry1, *proc_dentry2;
                unsigned long ptrace;
 
-               leader = current->group_leader;
-               /*
-                * If our leader is the child_reaper become
-                * the child_reaper and resend SIGKILL signal.
-                */
-               if (unlikely(leader == child_reaper)) {
-                       write_lock(&tasklist_lock);
-                       child_reaper = current;
-                       zap_other_threads(current);
-                       write_unlock(&tasklist_lock);
-               }
-
                /*
                 * Wait for the thread group leader to be a zombie.
                 * It should already be zombie at this point, most
                 * of the time.
                 */
+               leader = current->group_leader;
                while (leader->exit_state != EXIT_ZOMBIE)
                        yield();