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 49b3ea615dc..361fd1c96fc 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)  	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;  }  |