Commit b0dc1242 authored by Al Viro's avatar Al Viro Committed by Thomas Gleixner

posix-timers: Take compat timer_gettime(2) to native one

... and get rid of set_fs() in there
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: John Stultz <john.stultz@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20170607084241.28657-11-viro@ZenIV.linux.org.uk
parent 1acbe770
...@@ -635,23 +635,6 @@ COMPAT_SYSCALL_DEFINE3(timer_create, clockid_t, which_clock, ...@@ -635,23 +635,6 @@ COMPAT_SYSCALL_DEFINE3(timer_create, clockid_t, which_clock,
return sys_timer_create(which_clock, event, created_timer_id); return sys_timer_create(which_clock, event, created_timer_id);
} }
COMPAT_SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
struct compat_itimerspec __user *, setting)
{
long err;
mm_segment_t oldfs;
struct itimerspec ts;
oldfs = get_fs();
set_fs(KERNEL_DS);
err = sys_timer_gettime(timer_id,
(struct itimerspec __user *) &ts);
set_fs(oldfs);
if (!err && put_compat_itimerspec(setting, &ts))
return -EFAULT;
return err;
}
COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock, COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
struct compat_timespec __user *, tp) struct compat_timespec __user *, tp)
{ {
......
...@@ -43,6 +43,7 @@ SYS_NI(alarm); ...@@ -43,6 +43,7 @@ SYS_NI(alarm);
#endif #endif
COMPAT_SYS_NI(clock_adjtime); COMPAT_SYS_NI(clock_adjtime);
COMPAT_SYS_NI(timer_settime); COMPAT_SYS_NI(timer_settime);
COMPAT_SYS_NI(timer_gettime);
/* /*
* We preserve minimal support for CLOCK_REALTIME and CLOCK_MONOTONIC * We preserve minimal support for CLOCK_REALTIME and CLOCK_MONOTONIC
......
...@@ -690,11 +690,8 @@ void common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_setting) ...@@ -690,11 +690,8 @@ void common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_setting)
} }
/* Get the time remaining on a POSIX.1b interval timer. */ /* Get the time remaining on a POSIX.1b interval timer. */
SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id, static int do_timer_gettime(timer_t timer_id, struct itimerspec64 *setting)
struct itimerspec __user *, setting)
{ {
struct itimerspec64 cur_setting64;
struct itimerspec cur_setting;
struct k_itimer *timr; struct k_itimer *timr;
const struct k_clock *kc; const struct k_clock *kc;
unsigned long flags; unsigned long flags;
...@@ -704,21 +701,49 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id, ...@@ -704,21 +701,49 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
if (!timr) if (!timr)
return -EINVAL; return -EINVAL;
memset(&cur_setting64, 0, sizeof(cur_setting64)); memset(setting, 0, sizeof(*setting));
kc = timr->kclock; kc = timr->kclock;
if (WARN_ON_ONCE(!kc || !kc->timer_get)) if (WARN_ON_ONCE(!kc || !kc->timer_get))
ret = -EINVAL; ret = -EINVAL;
else else
kc->timer_get(timr, &cur_setting64); kc->timer_get(timr, setting);
unlock_timer(timr, flags); unlock_timer(timr, flags);
return ret;
}
/* Get the time remaining on a POSIX.1b interval timer. */
SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
struct itimerspec __user *, setting)
{
struct itimerspec64 cur_setting64;
int ret = do_timer_gettime(timer_id, &cur_setting64);
if (!ret) {
struct itimerspec cur_setting;
cur_setting = itimerspec64_to_itimerspec(&cur_setting64); cur_setting = itimerspec64_to_itimerspec(&cur_setting64);
if (!ret && copy_to_user(setting, &cur_setting, sizeof (cur_setting))) if (copy_to_user(setting, &cur_setting, sizeof (cur_setting)))
return -EFAULT; ret = -EFAULT;
}
return ret;
}
#ifdef CONFIG_COMPAT
COMPAT_SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
struct compat_itimerspec __user *, setting)
{
struct itimerspec64 cur_setting64;
int ret = do_timer_gettime(timer_id, &cur_setting64);
if (!ret) {
struct itimerspec cur_setting;
cur_setting = itimerspec64_to_itimerspec(&cur_setting64);
if (put_compat_itimerspec(setting, &cur_setting))
ret = -EFAULT;
}
return ret; return ret;
} }
#endif
/* /*
* Get the number of overruns of a POSIX.1b interval timer. This is to * Get the number of overruns of a POSIX.1b interval timer. This is to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment