|
@@ -266,9 +266,17 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
|
|
|
if (ids->in_use >= size)
|
|
|
return -ENOSPC;
|
|
|
|
|
|
+ spin_lock_init(&new->lock);
|
|
|
+ new->deleted = 0;
|
|
|
+ rcu_read_lock();
|
|
|
+ spin_lock(&new->lock);
|
|
|
+
|
|
|
err = idr_get_new(&ids->ipcs_idr, new, &id);
|
|
|
- if (err)
|
|
|
+ if (err) {
|
|
|
+ spin_unlock(&new->lock);
|
|
|
+ rcu_read_unlock();
|
|
|
return err;
|
|
|
+ }
|
|
|
|
|
|
ids->in_use++;
|
|
|
|
|
@@ -280,10 +288,6 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
|
|
|
ids->seq = 0;
|
|
|
|
|
|
new->id = ipc_buildid(id, new->seq);
|
|
|
- spin_lock_init(&new->lock);
|
|
|
- new->deleted = 0;
|
|
|
- rcu_read_lock();
|
|
|
- spin_lock(&new->lock);
|
|
|
return id;
|
|
|
}
|
|
|
|