]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - ipc/sem.c
ipc: add missing container_of()s for randstruct
[karo-tx-linux.git] / ipc / sem.c
index 445a5b5eb88fdf0449f6a953fc6f8174cea698d2..38371e93bfa5c4f101e264b46eab6a19f2f02404 100644 (file)
--- a/ipc/sem.c
+++ b/ipc/sem.c
@@ -258,18 +258,13 @@ static void merge_queues(struct sem_array *sma)
        }
 }
 
-static void __sem_free(struct sem_array *sma)
-{
-       kvfree(sma);
-}
-
 static void sem_rcu_free(struct rcu_head *head)
 {
        struct kern_ipc_perm *p = container_of(head, struct kern_ipc_perm, rcu);
        struct sem_array *sma = container_of(p, struct sem_array, sem_perm);
 
        security_sem_free(sma);
-       __sem_free(sma);
+       kvfree(sma);
 }
 
 /*
@@ -465,7 +460,6 @@ static struct sem_array *sem_alloc(size_t nsems)
                return NULL;
 
        memset(sma, 0, size);
-       atomic_set(&sma->sem_perm.refcount, 1);
 
        return sma;
 }
@@ -479,7 +473,6 @@ static struct sem_array *sem_alloc(size_t nsems)
  */
 static int newary(struct ipc_namespace *ns, struct ipc_params *params)
 {
-       int id;
        int retval;
        struct sem_array *sma;
        key_t key = params->key;
@@ -502,7 +495,7 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params)
        sma->sem_perm.security = NULL;
        retval = security_sem_alloc(sma);
        if (retval) {
-               __sem_free(sma);
+               kvfree(sma);
                return retval;
        }
 
@@ -520,10 +513,10 @@ static int newary(struct ipc_namespace *ns, struct ipc_params *params)
        sma->sem_nsems = nsems;
        sma->sem_ctime = get_seconds();
 
-       id = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni);
-       if (id < 0) {
-               ipc_rcu_putref(&sma->sem_perm, sem_rcu_free);
-               return id;
+       retval = ipc_addid(&sem_ids(ns), &sma->sem_perm, ns->sc_semmni);
+       if (retval < 0) {
+               call_rcu(&sma->sem_perm.rcu, sem_rcu_free);
+               return retval;
        }
        ns->used_sems += nsems;
 
@@ -2186,7 +2179,8 @@ void exit_sem(struct task_struct *tsk)
 static int sysvipc_sem_proc_show(struct seq_file *s, void *it)
 {
        struct user_namespace *user_ns = seq_user_ns(s);
-       struct sem_array *sma = it;
+       struct kern_ipc_perm *ipcp = it;
+       struct sem_array *sma = container_of(ipcp, struct sem_array, sem_perm);
        time_t sem_otime;
 
        /*