diff options
Diffstat (limited to 'ipc/util.c')
| -rw-r--r-- | ipc/util.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/ipc/util.c b/ipc/util.c index 49b3ea615dc5..361fd1c96fcf 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
| @@ -266,9 +266,17 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
| 266 | if (ids->in_use >= size) | 266 | if (ids->in_use >= size) |
| 267 | return -ENOSPC; | 267 | return -ENOSPC; |
| 268 | 268 | ||
| 269 | spin_lock_init(&new->lock); | ||
| 270 | new->deleted = 0; | ||
| 271 | rcu_read_lock(); | ||
| 272 | spin_lock(&new->lock); | ||
| 273 | |||
| 269 | err = idr_get_new(&ids->ipcs_idr, new, &id); | 274 | err = idr_get_new(&ids->ipcs_idr, new, &id); |
| 270 | if (err) | 275 | if (err) { |
| 276 | spin_unlock(&new->lock); | ||
| 277 | rcu_read_unlock(); | ||
| 271 | return err; | 278 | return err; |
| 279 | } | ||
| 272 | 280 | ||
| 273 | ids->in_use++; | 281 | ids->in_use++; |
| 274 | 282 | ||
| @@ -280,10 +288,6 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) | |||
| 280 | ids->seq = 0; | 288 | ids->seq = 0; |
| 281 | 289 | ||
| 282 | new->id = ipc_buildid(id, new->seq); | 290 | new->id = ipc_buildid(id, new->seq); |
| 283 | spin_lock_init(&new->lock); | ||
| 284 | new->deleted = 0; | ||
| 285 | rcu_read_lock(); | ||
| 286 | spin_lock(&new->lock); | ||
| 287 | return id; | 291 | return id; |
| 288 | } | 292 | } |
| 289 | 293 | ||
