#endif
        gid_t pid_gid;
        int hide_pid;
+       int reboot;     /* group exit code if this pidns was rebooted */
 };
 
 extern struct pid_namespace init_pid_ns;
 extern struct pid_namespace *copy_pid_ns(unsigned long flags, struct pid_namespace *ns);
 extern void free_pid_ns(struct kref *kref);
 extern void zap_pid_ns_processes(struct pid_namespace *pid_ns);
+extern int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd);
 
 static inline void put_pid_ns(struct pid_namespace *ns)
 {
 {
 }
 
-
 static inline void zap_pid_ns_processes(struct pid_namespace *ns)
 {
        BUG();
 }
+
+static inline int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd)
+{
+       return 0;
+}
 #endif /* CONFIG_PID_NS */
 
 extern struct pid_namespace *task_active_pid_ns(struct task_struct *tsk);
 
 #include <linux/acct.h>
 #include <linux/slab.h>
 #include <linux/proc_fs.h>
+#include <linux/reboot.h>
 
 #define BITS_PER_PAGE          (PAGE_SIZE*8)
 
                rc = sys_wait4(-1, NULL, __WALL, NULL);
        } while (rc != -ECHILD);
 
+       if (pid_ns->reboot)
+               current->signal->group_exit_code = pid_ns->reboot;
+
        acct_exit_ns(pid_ns);
        return;
 }
 
 static struct ctl_path kern_path[] = { { .procname = "kernel", }, { } };
 
+int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd)
+{
+       if (pid_ns == &init_pid_ns)
+               return 0;
+
+       switch (cmd) {
+       case LINUX_REBOOT_CMD_RESTART2:
+       case LINUX_REBOOT_CMD_RESTART:
+               pid_ns->reboot = SIGHUP;
+               break;
+
+       case LINUX_REBOOT_CMD_POWER_OFF:
+       case LINUX_REBOOT_CMD_HALT:
+               pid_ns->reboot = SIGINT;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       read_lock(&tasklist_lock);
+       force_sig(SIGKILL, pid_ns->child_reaper);
+       read_unlock(&tasklist_lock);
+
+       do_exit(0);
+
+       /* Not reached */
+       return 0;
+}
+
 static __init int pid_namespaces_init(void)
 {
        pid_ns_cachep = KMEM_CACHE(pid_namespace, SLAB_PANIC);
 
                        magic2 != LINUX_REBOOT_MAGIC2C))
                return -EINVAL;
 
+       /*
+        * If pid namespaces are enabled and the current task is in a child
+        * pid_namespace, the command is handled by reboot_pid_ns() which will
+        * call do_exit().
+        */
+       ret = reboot_pid_ns(task_active_pid_ns(current), cmd);
+       if (ret)
+               return ret;
+
        /* Instead of trying to make the power_off code look like
         * halt when pm_power_off is not set do it the easy way.
         */