[S390] ipc: call generic sys_ipc demultiplexer
authorHeiko Carstens <heiko.carstens@de.ibm.com>
Tue, 27 Dec 2011 10:27:21 +0000 (11:27 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 27 Dec 2011 10:27:13 +0000 (11:27 +0100)
Call generic IPC demultiplexer instead of having a nearly identical
s390 variant. Also make sure that native and compat handling now have
the same behaviour.

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/unistd.h
arch/s390/kernel/compat_linux.c
arch/s390/kernel/sys_s390.c

index 58de4c91c333358000779b283efdad2de1ebe445..8a8008fe7b8f15354d4661d1bddf37e0ac05e16a 100644 (file)
 #define __ARCH_WANT_SYS_SIGNAL
 #define __ARCH_WANT_SYS_UTIME
 #define __ARCH_WANT_SYS_SOCKETCALL
+#define __ARCH_WANT_SYS_IPC
 #define __ARCH_WANT_SYS_FADVISE64
 #define __ARCH_WANT_SYS_GETPGRP
 #define __ARCH_WANT_SYS_LLSEEK
index 84a982898448e04aeb971d3915ea9121610729af..ab64bdbab2ae3cf7b7025ad1d4afe1838c6cd6ec 100644 (file)
@@ -278,9 +278,6 @@ asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
 {
        if (call >> 16)         /* hack for backward compatibility */
                return -EINVAL;
-
-       call &= 0xffff;
-
        switch (call) {
        case SEMTIMEDOP:
                return compat_sys_semtimedop(first, compat_ptr(ptr),
index 476081440df9f4ec7674a0aed3f8dbbadcfd6fe5..78ea1948ff514f4e20df0686f38308427644fe21 100644 (file)
@@ -60,74 +60,22 @@ out:
 }
 
 /*
- * sys_ipc() is the de-multiplexer for the SysV IPC calls..
- *
- * This is really horribly ugly.
+ * sys_ipc() is the de-multiplexer for the SysV IPC calls.
  */
 SYSCALL_DEFINE5(s390_ipc, uint, call, int, first, unsigned long, second,
                unsigned long, third, void __user *, ptr)
 {
-        struct ipc_kludge tmp;
-       int ret;
-
-        switch (call) {
-        case SEMOP:
-               return sys_semtimedop(first, (struct sembuf __user *)ptr,
-                                      (unsigned)second, NULL);
-       case SEMTIMEDOP:
-               return sys_semtimedop(first, (struct sembuf __user *)ptr,
-                                      (unsigned)second,
-                                      (const struct timespec __user *) third);
-        case SEMGET:
-                return sys_semget(first, (int)second, third);
-        case SEMCTL: {
-                union semun fourth;
-                if (!ptr)
-                        return -EINVAL;
-                if (get_user(fourth.__pad, (void __user * __user *) ptr))
-                        return -EFAULT;
-                return sys_semctl(first, (int)second, third, fourth);
-        }
-        case MSGSND:
-               return sys_msgsnd (first, (struct msgbuf __user *) ptr,
-                                   (size_t)second, third);
-               break;
-        case MSGRCV:
-                if (!ptr)
-                        return -EINVAL;
-                if (copy_from_user (&tmp, (struct ipc_kludge __user *) ptr,
-                                    sizeof (struct ipc_kludge)))
-                        return -EFAULT;
-                return sys_msgrcv (first, tmp.msgp,
-                                   (size_t)second, tmp.msgtyp, third);
-        case MSGGET:
-                return sys_msgget((key_t)first, (int)second);
-        case MSGCTL:
-                return sys_msgctl(first, (int)second,
-                                  (struct msqid_ds __user *)ptr);
-
-       case SHMAT: {
-               ulong raddr;
-               ret = do_shmat(first, (char __user *)ptr,
-                               (int)second, &raddr);
-               if (ret)
-                       return ret;
-               return put_user (raddr, (ulong __user *) third);
-               break;
-        }
-       case SHMDT:
-               return sys_shmdt ((char __user *)ptr);
-       case SHMGET:
-               return sys_shmget(first, (size_t)second, third);
-       case SHMCTL:
-               return sys_shmctl(first, (int)second,
-                                   (struct shmid_ds __user *) ptr);
-       default:
-               return -ENOSYS;
-
-       }
-
-       return -EINVAL;
+       if (call >> 16)
+               return -EINVAL;
+       /* The s390 sys_ipc variant has only five parameters instead of six
+        * like the generic variant. The only difference is the handling of
+        * the SEMTIMEDOP subcall where on s390 the third parameter is used
+        * as a pointer to a struct timespec where the generic variant uses
+        * the fifth parameter.
+        * Therefore we can call the generic variant by simply passing the
+        * third parameter also as fifth parameter.
+        */
+       return sys_ipc(call, first, second, third, ptr, third);
 }
 
 #ifdef CONFIG_64BIT
This page took 0.026679 seconds and 5 git commands to generate.