mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
ipc: rename old-style shmctl/semctl/msgctl syscalls
The behavior of these system calls is slightly different between architectures, as determined by the CONFIG_ARCH_WANT_IPC_PARSE_VERSION symbol. Most architectures that implement the split IPC syscalls don't set that symbol and only get the modern version, but alpha, arm, microblaze, mips-n32, mips-n64 and xtensa expect the caller to pass the IPC_64 flag. For the architectures that so far only implement sys_ipc(), i.e. m68k, mips-o32, powerpc, s390, sh, sparc, and x86-32, we want the new behavior when adding the split syscalls, so we need to distinguish between the two groups of architectures. The method I picked for this distinction is to have a separate system call entry point: sys_old_*ctl() now uses ipc_parse_version, while sys_*ctl() does not. The system call tables of the five architectures are changed accordingly. As an additional benefit, we no longer need the configuration specific definition for ipc_parse_version(), it always does the same thing now, but simply won't get called on architectures with the modern interface. A small downside is that on architectures that do set ARCH_WANT_IPC_PARSE_VERSION, we now have an extra set of entry points that are never called. They only add a few bytes of bloat, so it seems better to keep them compared to adding yet another Kconfig symbol. I considered adding new syscall numbers for the IPC_64 variants for consistency, but decided against that for now. Signed-off-by: Arnd Bergmann <[email protected]>
This commit is contained in:
parent
73a66023c9
commit
275f22148e
14 changed files with 137 additions and 62 deletions
39
ipc/sem.c
39
ipc/sem.c
|
|
@ -1634,9 +1634,8 @@ out_up:
|
|||
return err;
|
||||
}
|
||||
|
||||
long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg)
|
||||
static long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg, int version)
|
||||
{
|
||||
int version;
|
||||
struct ipc_namespace *ns;
|
||||
void __user *p = (void __user *)arg;
|
||||
struct semid64_ds semid64;
|
||||
|
|
@ -1645,7 +1644,6 @@ long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg)
|
|||
if (semid < 0)
|
||||
return -EINVAL;
|
||||
|
||||
version = ipc_parse_version(&cmd);
|
||||
ns = current->nsproxy->ipc_ns;
|
||||
|
||||
switch (cmd) {
|
||||
|
|
@ -1691,9 +1689,23 @@ long ksys_semctl(int semid, int semnum, int cmd, unsigned long arg)
|
|||
|
||||
SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
|
||||
{
|
||||
return ksys_semctl(semid, semnum, cmd, arg);
|
||||
return ksys_semctl(semid, semnum, cmd, arg, IPC_64);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_WANT_IPC_PARSE_VERSION
|
||||
long ksys_old_semctl(int semid, int semnum, int cmd, unsigned long arg)
|
||||
{
|
||||
int version = ipc_parse_version(&cmd);
|
||||
|
||||
return ksys_semctl(semid, semnum, cmd, arg, version);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE4(old_semctl, int, semid, int, semnum, int, cmd, unsigned long, arg)
|
||||
{
|
||||
return ksys_old_semctl(semid, semnum, cmd, arg);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
||||
struct compat_semid_ds {
|
||||
|
|
@ -1744,12 +1756,11 @@ static int copy_compat_semid_to_user(void __user *buf, struct semid64_ds *in,
|
|||
}
|
||||
}
|
||||
|
||||
long compat_ksys_semctl(int semid, int semnum, int cmd, int arg)
|
||||
static long compat_ksys_semctl(int semid, int semnum, int cmd, int arg, int version)
|
||||
{
|
||||
void __user *p = compat_ptr(arg);
|
||||
struct ipc_namespace *ns;
|
||||
struct semid64_ds semid64;
|
||||
int version = compat_ipc_parse_version(&cmd);
|
||||
int err;
|
||||
|
||||
ns = current->nsproxy->ipc_ns;
|
||||
|
|
@ -1792,8 +1803,22 @@ long compat_ksys_semctl(int semid, int semnum, int cmd, int arg)
|
|||
|
||||
COMPAT_SYSCALL_DEFINE4(semctl, int, semid, int, semnum, int, cmd, int, arg)
|
||||
{
|
||||
return compat_ksys_semctl(semid, semnum, cmd, arg);
|
||||
return compat_ksys_semctl(semid, semnum, cmd, arg, IPC_64);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_WANT_COMPAT_IPC_PARSE_VERSION
|
||||
long compat_ksys_old_semctl(int semid, int semnum, int cmd, int arg)
|
||||
{
|
||||
int version = compat_ipc_parse_version(&cmd);
|
||||
|
||||
return compat_ksys_semctl(semid, semnum, cmd, arg, version);
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE4(old_semctl, int, semid, int, semnum, int, cmd, int, arg)
|
||||
{
|
||||
return compat_ksys_old_semctl(semid, semnum, cmd, arg);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* If the task doesn't already have a undo_list, then allocate one
|
||||
|
|
|
|||
Loading…
Reference in a new issue