diff options
| author | H. Peter Anvin <hpa@zytor.com> | 2009-03-04 00:05:42 -0500 |
|---|---|---|
| committer | H. Peter Anvin <hpa@zytor.com> | 2009-03-04 00:05:42 -0500 |
| commit | 2e22ea7cea0f7de86fd30df867fbf5b7e8eee0fd (patch) | |
| tree | 8b8e5583fb2787ff7107a6f59b114ddcd2c2f691 /kernel | |
| parent | 638bee71c83a2837b48062fdc5b222163cf53d79 (diff) | |
| parent | 645af4e9e0e32481e3336dda813688732c7e5f0f (diff) | |
Merge branch 'x86/core' into x86/mce2
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/user_namespace.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c index 79084311ee57..076c7c8215b0 100644 --- a/kernel/user_namespace.c +++ b/kernel/user_namespace.c | |||
| @@ -60,12 +60,25 @@ int create_user_ns(struct cred *new) | |||
| 60 | return 0; | 60 | return 0; |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | void free_user_ns(struct kref *kref) | 63 | /* |
| 64 | * Deferred destructor for a user namespace. This is required because | ||
| 65 | * free_user_ns() may be called with uidhash_lock held, but we need to call | ||
| 66 | * back to free_uid() which will want to take the lock again. | ||
| 67 | */ | ||
| 68 | static void free_user_ns_work(struct work_struct *work) | ||
| 64 | { | 69 | { |
| 65 | struct user_namespace *ns; | 70 | struct user_namespace *ns = |
| 66 | 71 | container_of(work, struct user_namespace, destroyer); | |
| 67 | ns = container_of(kref, struct user_namespace, kref); | ||
| 68 | free_uid(ns->creator); | 72 | free_uid(ns->creator); |
| 69 | kfree(ns); | 73 | kfree(ns); |
| 70 | } | 74 | } |
| 75 | |||
| 76 | void free_user_ns(struct kref *kref) | ||
| 77 | { | ||
| 78 | struct user_namespace *ns = | ||
| 79 | container_of(kref, struct user_namespace, kref); | ||
| 80 | |||
| 81 | INIT_WORK(&ns->destroyer, free_user_ns_work); | ||
| 82 | schedule_work(&ns->destroyer); | ||
| 83 | } | ||
| 71 | EXPORT_SYMBOL(free_user_ns); | 84 | EXPORT_SYMBOL(free_user_ns); |
