Merge branches 'release' and 'ppc-workaround' into release
[sfrench/cifs-2.6.git] / ipc / util.c
index b42fbd58973a02f2d59a29204a23c5323bcd960c..76c1f3461e22603496652242299af80d0e17d860 100644 (file)
@@ -262,7 +262,7 @@ int ipc_get_maxid(struct ipc_ids *ids)
  *     Add an entry 'new' to the IPC ids idr. The permissions object is
  *     initialised and the first free entry is set up and the id assigned
  *     is returned. The 'new' entry is returned in a locked state on success.
- *     On failure the entry is not locked and -1 is returned.
+ *     On failure the entry is not locked and a negative err-code is returned.
  *
  *     Called with ipc_ids.rw_mutex held as a writer.
  */
@@ -275,11 +275,11 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
                size = IPCMNI;
 
        if (ids->in_use >= size)
-               return -1;
+               return -ENOSPC;
 
        err = idr_get_new(&ids->ipcs_idr, new, &id);
        if (err)
-               return -1;
+               return err;
 
        ids->in_use++;
 
@@ -311,7 +311,7 @@ int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
                struct ipc_ops *ops, struct ipc_params *params)
 {
        int err;
-
+retry:
        err = idr_pre_get(&ids->ipcs_idr, GFP_KERNEL);
 
        if (!err)
@@ -321,6 +321,9 @@ int ipcget_new(struct ipc_namespace *ns, struct ipc_ids *ids,
        err = ops->getnew(ns, params);
        up_write(&ids->rw_mutex);
 
+       if (err == -EAGAIN)
+               goto retry;
+
        return err;
 }
 
@@ -374,7 +377,7 @@ int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
        struct kern_ipc_perm *ipcp;
        int flg = params->flg;
        int err;
-
+retry:
        err = idr_pre_get(&ids->ipcs_idr, GFP_KERNEL);
 
        /*
@@ -411,6 +414,9 @@ int ipcget_public(struct ipc_namespace *ns, struct ipc_ids *ids,
        }
        up_write(&ids->rw_mutex);
 
+       if (err == -EAGAIN)
+               goto retry;
+
        return err;
 }
 
@@ -796,8 +802,8 @@ struct ipc_proc_iter {
 /*
  * This routine locks the ipc structure found at least at position pos.
  */
-struct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t pos,
-                                       loff_t *new_pos)
+static struct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t pos,
+                                             loff_t *new_pos)
 {
        struct kern_ipc_perm *ipc;
        int total, id;