]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - kernel/user_namespace.c
tg3: Remove 5720, 5750, and 5750M
[net-next-2.6.git] / kernel / user_namespace.c
index 076c7c8215b0e15289130fa5339bfc26dced7514..25915832291acf2931d2ac7bbabdcad1c3cf3aee 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/nsproxy.h>
 #include <linux/slab.h>
 #include <linux/user_namespace.h>
+#include <linux/highuid.h>
 #include <linux/cred.h>
 
 /*
@@ -54,8 +55,8 @@ int create_user_ns(struct cred *new)
 #endif
        /* tgcred will be cleared in our caller bc CLONE_THREAD won't be set */
 
-       /* alloc_uid() incremented the userns refcount.  Just set it to 1 */
-       kref_set(&ns->kref, 1);
+       /* root_user holds a reference to ns, our reference can be dropped */
+       put_user_ns(ns);
 
        return 0;
 }
@@ -82,3 +83,46 @@ void free_user_ns(struct kref *kref)
        schedule_work(&ns->destroyer);
 }
 EXPORT_SYMBOL(free_user_ns);
+
+uid_t user_ns_map_uid(struct user_namespace *to, const struct cred *cred, uid_t uid)
+{
+       struct user_namespace *tmp;
+
+       if (likely(to == cred->user->user_ns))
+               return uid;
+
+
+       /* Is cred->user the creator of the target user_ns
+        * or the creator of one of it's parents?
+        */
+       for ( tmp = to; tmp != &init_user_ns;
+             tmp = tmp->creator->user_ns ) {
+               if (cred->user == tmp->creator) {
+                       return (uid_t)0;
+               }
+       }
+
+       /* No useful relationship so no mapping */
+       return overflowuid;
+}
+
+gid_t user_ns_map_gid(struct user_namespace *to, const struct cred *cred, gid_t gid)
+{
+       struct user_namespace *tmp;
+
+       if (likely(to == cred->user->user_ns))
+               return gid;
+
+       /* Is cred->user the creator of the target user_ns
+        * or the creator of one of it's parents?
+        */
+       for ( tmp = to; tmp != &init_user_ns;
+             tmp = tmp->creator->user_ns ) {
+               if (cred->user == tmp->creator) {
+                       return (gid_t)0;
+               }
+       }
+
+       /* No useful relationship so no mapping */
+       return overflowgid;
+}