]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ipcsem-open-code-and-rename-sem_lock-fix
authorAndrew Morton <akpm@linux-foundation.org>
Tue, 26 Mar 2013 23:26:02 +0000 (10:26 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Tue, 2 Apr 2013 07:29:54 +0000 (18:29 +1100)
propagate the ipc_obtain_object() errno out of sem_obtain_lock()

Cc: Chegu Vinod <chegu_vinod@hp.com>
Cc: Davidlohr Bueso <davidlohr.bueso@hp.com>
Cc: Emmanuel Benisty <benisty.e@gmail.com>
Cc: Jason Low <jason.low2@hp.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Michel Lespinasse <walken@google.com>
Cc: Peter Hurley <peter@hurleysoftware.com>
Cc: Rik van Riel <riel@redhat.com>
Cc: Rik van Riel <riel@surriel.com>
Cc: Stanislav Kinsbursky <skinsbursky@parallels.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
ipc/sem.c

index 26c39ec01ab77d38069692a439767afecf35a286..290acca89894251132322cf08fddb5e670baeee1 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -197,26 +197,28 @@ void __init sem_init (void)
 static inline struct sem_array *sem_obtain_lock(struct ipc_namespace *ns, int id)
 {
        struct kern_ipc_perm *ipcp;
+       struct sem_array *sma;
 
        rcu_read_lock();
        ipcp = ipc_obtain_object(&sem_ids(ns), id);
-       if (IS_ERR(ipcp))
-               goto err1;
+       if (IS_ERR(ipcp)) {
+               sma = ERR_CAST(ipcp);
+               goto err;
+       }
 
        spin_lock(&ipcp->lock);
 
        /* ipc_rmid() may have already freed the ID while sem_lock
         * was spinning: verify that the structure is still valid
         */
-       if (ipcp->deleted)
-               goto err0;
+       if (!ipcp->deleted)
+               return container_of(ipcp, struct sem_array, sem_perm);
 
-       return container_of(ipcp, struct sem_array, sem_perm);
-err0:
        spin_unlock(&ipcp->lock);
-err1:
+       sma = ERR_PTR(-EINVAL);
+err:
        rcu_read_unlock();
-       return ERR_PTR(-EINVAL);
+       return sma;
 }
 
 static inline struct sem_array *sem_obtain_object(struct ipc_namespace *ns, int id)