Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 357754
b: refs/heads/master
c: c61a281
h: refs/heads/master
v: v3
  • Loading branch information
Eric W. Biederman committed Jan 27, 2013
1 parent 25185fa commit 0c438f1
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 17 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 923c7538236564c46ee80c253a416705321f13e3
refs/heads/master: c61a2810a2161986353705b44d9503e6bb079f4f
10 changes: 5 additions & 5 deletions trunk/include/linux/user_namespace.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ struct user_namespace {
struct uid_gid_map uid_map;
struct uid_gid_map gid_map;
struct uid_gid_map projid_map;
struct kref kref;
atomic_t count;
struct user_namespace *parent;
kuid_t owner;
kgid_t group;
Expand All @@ -35,18 +35,18 @@ extern struct user_namespace init_user_ns;
static inline struct user_namespace *get_user_ns(struct user_namespace *ns)
{
if (ns)
kref_get(&ns->kref);
atomic_inc(&ns->count);
return ns;
}

extern int create_user_ns(struct cred *new);
extern int unshare_userns(unsigned long unshare_flags, struct cred **new_cred);
extern void free_user_ns(struct kref *kref);
extern void free_user_ns(struct user_namespace *ns);

static inline void put_user_ns(struct user_namespace *ns)
{
if (ns)
kref_put(&ns->kref, free_user_ns);
if (ns && atomic_dec_and_test(&ns->count))
free_user_ns(ns);
}

struct seq_operations;
Expand Down
4 changes: 1 addition & 3 deletions trunk/kernel/user.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,7 @@ struct user_namespace init_user_ns = {
.count = 4294967295U,
},
},
.kref = {
.refcount = ATOMIC_INIT(3),
},
.count = ATOMIC_INIT(3),
.owner = GLOBAL_ROOT_UID,
.group = GLOBAL_ROOT_GID,
.proc_inum = PROC_USER_INIT_INO,
Expand Down
17 changes: 9 additions & 8 deletions trunk/kernel/user_namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ int create_user_ns(struct cred *new)
return ret;
}

kref_init(&ns->kref);
atomic_set(&ns->count, 1);
/* Leave the new->user_ns reference with the new user namespace. */
ns->parent = parent_ns;
ns->owner = owner;
Expand All @@ -104,15 +104,16 @@ int unshare_userns(unsigned long unshare_flags, struct cred **new_cred)
return create_user_ns(cred);
}

void free_user_ns(struct kref *kref)
void free_user_ns(struct user_namespace *ns)
{
struct user_namespace *parent, *ns =
container_of(kref, struct user_namespace, kref);
struct user_namespace *parent;

parent = ns->parent;
proc_free_inum(ns->proc_inum);
kmem_cache_free(user_ns_cachep, ns);
put_user_ns(parent);
do {
parent = ns->parent;
proc_free_inum(ns->proc_inum);
kmem_cache_free(user_ns_cachep, ns);
ns = parent;
} while (atomic_dec_and_test(&parent->count));
}
EXPORT_SYMBOL(free_user_ns);

Expand Down

0 comments on commit 0c438f1

Please sign in to comment.