diff options
Diffstat (limited to 'kernel/pid.c')
| -rw-r--r-- | kernel/pid.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/kernel/pid.c b/kernel/pid.c index d3f722d20f9c..2e17c9c92cbe 100644 --- a/kernel/pid.c +++ b/kernel/pid.c | |||
| @@ -141,11 +141,12 @@ static int alloc_pidmap(struct pid_namespace *pid_ns) | |||
| 141 | * installing it: | 141 | * installing it: |
| 142 | */ | 142 | */ |
| 143 | spin_lock_irq(&pidmap_lock); | 143 | spin_lock_irq(&pidmap_lock); |
| 144 | if (map->page) | 144 | if (!map->page) { |
| 145 | kfree(page); | ||
| 146 | else | ||
| 147 | map->page = page; | 145 | map->page = page; |
| 146 | page = NULL; | ||
| 147 | } | ||
| 148 | spin_unlock_irq(&pidmap_lock); | 148 | spin_unlock_irq(&pidmap_lock); |
| 149 | kfree(page); | ||
| 149 | if (unlikely(!map->page)) | 150 | if (unlikely(!map->page)) |
| 150 | break; | 151 | break; |
| 151 | } | 152 | } |
| @@ -268,12 +269,11 @@ struct pid *alloc_pid(struct pid_namespace *ns) | |||
| 268 | for (type = 0; type < PIDTYPE_MAX; ++type) | 269 | for (type = 0; type < PIDTYPE_MAX; ++type) |
| 269 | INIT_HLIST_HEAD(&pid->tasks[type]); | 270 | INIT_HLIST_HEAD(&pid->tasks[type]); |
| 270 | 271 | ||
| 272 | upid = pid->numbers + ns->level; | ||
| 271 | spin_lock_irq(&pidmap_lock); | 273 | spin_lock_irq(&pidmap_lock); |
| 272 | for (i = ns->level; i >= 0; i--) { | 274 | for ( ; upid >= pid->numbers; --upid) |
| 273 | upid = &pid->numbers[i]; | ||
| 274 | hlist_add_head_rcu(&upid->pid_chain, | 275 | hlist_add_head_rcu(&upid->pid_chain, |
| 275 | &pid_hash[pid_hashfn(upid->nr, upid->ns)]); | 276 | &pid_hash[pid_hashfn(upid->nr, upid->ns)]); |
| 276 | } | ||
| 277 | spin_unlock_irq(&pidmap_lock); | 277 | spin_unlock_irq(&pidmap_lock); |
| 278 | 278 | ||
| 279 | out: | 279 | out: |
