X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ipc%2Futil.c;h=1aa0ebf71bac7e5c30559eb0f60a89bdc6688efb;hb=19f1537b7b8a9a82665db3ad8210a9d954d13acd;hp=b42fbd58973a02f2d59a29204a23c5323bcd960c;hpb=3e148c79938aa39035669c1cfa3ff60722134535;p=linux-2.6 diff --git a/ipc/util.c b/ipc/util.c index b42fbd5897..1aa0ebf71b 100644 --- a/ipc/util.c +++ b/ipc/util.c @@ -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; }