genirq: fix regression in irqfixup, irqpoll
[linux-2.6.git] / kernel / pid_namespace.c
index 821722a..e9c9adc 100644 (file)
@@ -13,6 +13,8 @@
 #include <linux/syscalls.h>
 #include <linux/err.h>
 #include <linux/acct.h>
+#include <linux/slab.h>
+#include <linux/proc_fs.h>
 
 #define BITS_PER_PAGE          (PAGE_SIZE*8)
 
@@ -71,7 +73,7 @@ static struct pid_namespace *create_pid_namespace(struct pid_namespace *parent_p
 {
        struct pid_namespace *ns;
        unsigned int level = parent_pid_ns->level + 1;
-       int i;
+       int i, err = -ENOMEM;
 
        ns = kmem_cache_zalloc(pid_ns_cachep, GFP_KERNEL);
        if (ns == NULL)
@@ -95,14 +97,20 @@ static struct pid_namespace *create_pid_namespace(struct pid_namespace *parent_p
        for (i = 1; i < PIDMAP_ENTRIES; i++)
                atomic_set(&ns->pidmap[i].nr_free, BITS_PER_PAGE);
 
+       err = pid_ns_prepare_proc(ns);
+       if (err)
+               goto out_put_parent_pid_ns;
+
        return ns;
 
+out_put_parent_pid_ns:
+       put_pid_ns(parent_pid_ns);
 out_free_map:
        kfree(ns->pidmap[0].page);
 out_free:
        kmem_cache_free(pid_ns_cachep, ns);
 out:
-       return ERR_PTR(-ENOMEM);
+       return ERR_PTR(err);
 }
 
 static void destroy_pid_namespace(struct pid_namespace *ns)
@@ -118,7 +126,7 @@ struct pid_namespace *copy_pid_ns(unsigned long flags, struct pid_namespace *old
 {
        if (!(flags & CLONE_NEWPID))
                return get_pid_ns(old_ns);
-       if (flags & CLONE_THREAD)
+       if (flags & (CLONE_THREAD|CLONE_PARENT))
                return ERR_PTR(-EINVAL);
        return create_pid_namespace(old_ns);
 }
@@ -161,13 +169,12 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)
                rcu_read_lock();
 
                /*
-                * Use force_sig() since it clears SIGNAL_UNKILLABLE ensuring
-                * any nested-container's init processes don't ignore the
-                * signal
+                * Any nested-container's init processes won't ignore the
+                * SEND_SIG_NOINFO signal, see send_signal()->si_fromuser().
                 */
                task = pid_task(find_vpid(nr), PIDTYPE_PID);
                if (task)
-                       force_sig(SIGKILL, task);
+                       send_sig_info(SIGKILL, SEND_SIG_NOINFO, task);
 
                rcu_read_unlock();