diff options
Diffstat (limited to 'ipc/util.c')
-rw-r--r-- | ipc/util.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/ipc/util.c b/ipc/util.c index 3fdfabfdd9c3..b99038699fee 100644 --- a/ipc/util.c +++ b/ipc/util.c @@ -583,19 +583,22 @@ struct kern_ipc_perm *ipc_lock(struct ipc_ids *ids, int id) rcu_read_lock(); out = ipc_obtain_object_idr(ids, id); if (IS_ERR(out)) - goto err1; + goto err; spin_lock(&out->lock); - /* ipc_rmid() may have already freed the ID while ipc_lock - * was spinning: here verify that the structure is still valid + /* + * ipc_rmid() may have already freed the ID while ipc_lock() + * was spinning: here verify that the structure is still valid. + * Upon races with RMID, return -EIDRM, thus indicating that + * the ID points to a removed identifier. */ if (ipc_valid_object(out)) return out; spin_unlock(&out->lock); - out = ERR_PTR(-EINVAL); -err1: + out = ERR_PTR(-EIDRM); +err: rcu_read_unlock(); return out; } |