Merge branch 'timers-2038-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull year 2038 updates from Thomas Gleixner: "Another round of changes to make the kernel ready for 2038. After lots of preparatory work this is the first set of syscalls which are 2038 safe: 403 clock_gettime64 404 clock_settime64 405 clock_adjtime64 406 clock_getres_time64 407 clock_nanosleep_time64 408 timer_gettime64 409 timer_settime64 410 timerfd_gettime64 411 timerfd_settime64 412 utimensat_time64 413 pselect6_time64 414 ppoll_time64 416 io_pgetevents_time64 417 recvmmsg_time64 418 mq_timedsend_time64 419 mq_timedreceiv_time64 420 semtimedop_time64 421 rt_sigtimedwait_time64 422 futex_time64 423 sched_rr_get_interval_time64 The syscall numbers are identical all over the architectures" * 'timers-2038-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (36 commits) riscv: Use latest system call ABI checksyscalls: fix up mq_timedreceive and stat exceptions unicore32: Fix __ARCH_WANT_STAT64 definition asm-generic: Make time32 syscall numbers optional asm-generic: Drop getrlimit and setrlimit syscalls from default list 32-bit userspace ABI: introduce ARCH_32BIT_OFF_T config option compat ABI: use non-compat openat and open_by_handle_at variants y2038: add 64-bit time_t syscalls to all 32-bit architectures y2038: rename old time and utime syscalls y2038: remove struct definition redirects y2038: use time32 syscall names on 32-bit syscalls: remove obsolete __IGNORE_ macros y2038: syscalls: rename y2038 compat syscalls x86/x32: use time64 versions of sigtimedwait and recvmmsg timex: change syscalls to use struct __kernel_timex timex: use __kernel_timex internally sparc64: add custom adjtimex/clock_adjtime functions time: fix sys_timer_settime prototype time: Add struct __kernel_timex time: make adjtime compat handling available for 32 bit ...
This commit is contained in:
@@ -1771,7 +1771,7 @@ SYSCALL_DEFINE2(nanosleep, struct __kernel_timespec __user *, rqtp,
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(nanosleep, struct old_timespec32 __user *, rqtp,
|
||||
SYSCALL_DEFINE2(nanosleep_time32, struct old_timespec32 __user *, rqtp,
|
||||
struct old_timespec32 __user *, rmtp)
|
||||
{
|
||||
struct timespec64 tu;
|
||||
|
@@ -188,13 +188,13 @@ static inline int is_error_status(int status)
|
||||
&& (status & (STA_PPSWANDER|STA_PPSERROR)));
|
||||
}
|
||||
|
||||
static inline void pps_fill_timex(struct timex *txc)
|
||||
static inline void pps_fill_timex(struct __kernel_timex *txc)
|
||||
{
|
||||
txc->ppsfreq = shift_right((pps_freq >> PPM_SCALE_INV_SHIFT) *
|
||||
PPM_SCALE_INV, NTP_SCALE_SHIFT);
|
||||
txc->jitter = pps_jitter;
|
||||
if (!(time_status & STA_NANO))
|
||||
txc->jitter /= NSEC_PER_USEC;
|
||||
txc->jitter = pps_jitter / NSEC_PER_USEC;
|
||||
txc->shift = pps_shift;
|
||||
txc->stabil = pps_stabil;
|
||||
txc->jitcnt = pps_jitcnt;
|
||||
@@ -220,7 +220,7 @@ static inline int is_error_status(int status)
|
||||
return status & (STA_UNSYNC|STA_CLOCKERR);
|
||||
}
|
||||
|
||||
static inline void pps_fill_timex(struct timex *txc)
|
||||
static inline void pps_fill_timex(struct __kernel_timex *txc)
|
||||
{
|
||||
/* PPS is not implemented, so these are zero */
|
||||
txc->ppsfreq = 0;
|
||||
@@ -633,7 +633,7 @@ void ntp_notify_cmos_timer(void)
|
||||
/*
|
||||
* Propagate a new txc->status value into the NTP state:
|
||||
*/
|
||||
static inline void process_adj_status(const struct timex *txc)
|
||||
static inline void process_adj_status(const struct __kernel_timex *txc)
|
||||
{
|
||||
if ((time_status & STA_PLL) && !(txc->status & STA_PLL)) {
|
||||
time_state = TIME_OK;
|
||||
@@ -656,7 +656,8 @@ static inline void process_adj_status(const struct timex *txc)
|
||||
}
|
||||
|
||||
|
||||
static inline void process_adjtimex_modes(const struct timex *txc, s32 *time_tai)
|
||||
static inline void process_adjtimex_modes(const struct __kernel_timex *txc,
|
||||
s32 *time_tai)
|
||||
{
|
||||
if (txc->modes & ADJ_STATUS)
|
||||
process_adj_status(txc);
|
||||
@@ -707,7 +708,8 @@ static inline void process_adjtimex_modes(const struct timex *txc, s32 *time_tai
|
||||
* adjtimex mainly allows reading (and writing, if superuser) of
|
||||
* kernel time-keeping variables. used by xntpd.
|
||||
*/
|
||||
int __do_adjtimex(struct timex *txc, const struct timespec64 *ts, s32 *time_tai)
|
||||
int __do_adjtimex(struct __kernel_timex *txc, const struct timespec64 *ts,
|
||||
s32 *time_tai)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -729,7 +731,7 @@ int __do_adjtimex(struct timex *txc, const struct timespec64 *ts, s32 *time_tai)
|
||||
txc->offset = shift_right(time_offset * NTP_INTERVAL_FREQ,
|
||||
NTP_SCALE_SHIFT);
|
||||
if (!(time_status & STA_NANO))
|
||||
txc->offset /= NSEC_PER_USEC;
|
||||
txc->offset = (u32)txc->offset / NSEC_PER_USEC;
|
||||
}
|
||||
|
||||
result = time_state; /* mostly `TIME_OK' */
|
||||
@@ -754,7 +756,7 @@ int __do_adjtimex(struct timex *txc, const struct timespec64 *ts, s32 *time_tai)
|
||||
txc->time.tv_sec = (time_t)ts->tv_sec;
|
||||
txc->time.tv_usec = ts->tv_nsec;
|
||||
if (!(time_status & STA_NANO))
|
||||
txc->time.tv_usec /= NSEC_PER_USEC;
|
||||
txc->time.tv_usec = ts->tv_nsec / NSEC_PER_USEC;
|
||||
|
||||
/* Handle leapsec adjustments */
|
||||
if (unlikely(ts->tv_sec >= ntp_next_leap_sec)) {
|
||||
|
@@ -8,6 +8,6 @@ extern void ntp_clear(void);
|
||||
extern u64 ntp_tick_length(void);
|
||||
extern ktime_t ntp_get_next_leap(void);
|
||||
extern int second_overflow(time64_t secs);
|
||||
extern int __do_adjtimex(struct timex *txc, const struct timespec64 *ts, s32 *time_tai);
|
||||
extern int __do_adjtimex(struct __kernel_timex *txc, const struct timespec64 *ts, s32 *time_tai);
|
||||
extern void __hardpps(const struct timespec64 *phase_ts, const struct timespec64 *raw_ts);
|
||||
#endif /* _LINUX_NTP_INTERNAL_H */
|
||||
|
@@ -228,7 +228,7 @@ static void put_clock_desc(struct posix_clock_desc *cd)
|
||||
fput(cd->fp);
|
||||
}
|
||||
|
||||
static int pc_clock_adjtime(clockid_t id, struct timex *tx)
|
||||
static int pc_clock_adjtime(clockid_t id, struct __kernel_timex *tx)
|
||||
{
|
||||
struct posix_clock_desc cd;
|
||||
int err;
|
||||
|
@@ -45,6 +45,7 @@ SYS_NI(timer_delete);
|
||||
SYS_NI(clock_adjtime);
|
||||
SYS_NI(getitimer);
|
||||
SYS_NI(setitimer);
|
||||
SYS_NI(clock_adjtime32);
|
||||
#ifdef __ARCH_WANT_SYS_ALARM
|
||||
SYS_NI(alarm);
|
||||
#endif
|
||||
@@ -150,16 +151,16 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
COMPAT_SYS_NI(timer_create);
|
||||
COMPAT_SYS_NI(clock_adjtime);
|
||||
COMPAT_SYS_NI(timer_settime);
|
||||
COMPAT_SYS_NI(timer_gettime);
|
||||
COMPAT_SYS_NI(getitimer);
|
||||
COMPAT_SYS_NI(setitimer);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
COMPAT_SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
SYS_NI(timer_settime32);
|
||||
SYS_NI(timer_gettime32);
|
||||
|
||||
SYSCALL_DEFINE2(clock_settime32, const clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
{
|
||||
struct timespec64 new_tp;
|
||||
|
||||
@@ -171,8 +172,8 @@ COMPAT_SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
|
||||
return do_sys_settimeofday64(&new_tp, NULL);
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
SYSCALL_DEFINE2(clock_gettime32, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
{
|
||||
int ret;
|
||||
struct timespec64 kernel_tp;
|
||||
@@ -186,8 +187,8 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
||||
return 0;
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
SYSCALL_DEFINE2(clock_getres_time32, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
{
|
||||
struct timespec64 rtn_tp = {
|
||||
.tv_sec = 0,
|
||||
@@ -206,9 +207,9 @@ COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
||||
}
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
|
||||
struct old_timespec32 __user *, rqtp,
|
||||
struct old_timespec32 __user *, rmtp)
|
||||
SYSCALL_DEFINE4(clock_nanosleep_time32, clockid_t, which_clock, int, flags,
|
||||
struct old_timespec32 __user *, rqtp,
|
||||
struct old_timespec32 __user *, rmtp)
|
||||
{
|
||||
struct timespec64 t;
|
||||
|
||||
|
@@ -179,7 +179,7 @@ static int posix_clock_realtime_set(const clockid_t which_clock,
|
||||
}
|
||||
|
||||
static int posix_clock_realtime_adj(const clockid_t which_clock,
|
||||
struct timex *t)
|
||||
struct __kernel_timex *t)
|
||||
{
|
||||
return do_adjtimex(t);
|
||||
}
|
||||
@@ -730,8 +730,8 @@ SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
|
||||
struct old_itimerspec32 __user *, setting)
|
||||
SYSCALL_DEFINE2(timer_gettime32, timer_t, timer_id,
|
||||
struct old_itimerspec32 __user *, setting)
|
||||
{
|
||||
struct itimerspec64 cur_setting;
|
||||
|
||||
@@ -903,9 +903,9 @@ SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
COMPAT_SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
|
||||
struct old_itimerspec32 __user *, new,
|
||||
struct old_itimerspec32 __user *, old)
|
||||
SYSCALL_DEFINE4(timer_settime32, timer_t, timer_id, int, flags,
|
||||
struct old_itimerspec32 __user *, new,
|
||||
struct old_itimerspec32 __user *, old)
|
||||
{
|
||||
struct itimerspec64 new_spec, old_spec;
|
||||
struct itimerspec64 *rtn = old ? &old_spec : NULL;
|
||||
@@ -1047,22 +1047,28 @@ SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
|
||||
return error;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(clock_adjtime, const clockid_t, which_clock,
|
||||
struct timex __user *, utx)
|
||||
int do_clock_adjtime(const clockid_t which_clock, struct __kernel_timex * ktx)
|
||||
{
|
||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timex ktx;
|
||||
int err;
|
||||
|
||||
if (!kc)
|
||||
return -EINVAL;
|
||||
if (!kc->clock_adj)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return kc->clock_adj(which_clock, ktx);
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE2(clock_adjtime, const clockid_t, which_clock,
|
||||
struct __kernel_timex __user *, utx)
|
||||
{
|
||||
struct __kernel_timex ktx;
|
||||
int err;
|
||||
|
||||
if (copy_from_user(&ktx, utx, sizeof(ktx)))
|
||||
return -EFAULT;
|
||||
|
||||
err = kc->clock_adj(which_clock, &ktx);
|
||||
err = do_clock_adjtime(which_clock, &ktx);
|
||||
|
||||
if (err >= 0 && copy_to_user(utx, &ktx, sizeof(ktx)))
|
||||
return -EFAULT;
|
||||
@@ -1090,8 +1096,8 @@ SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
SYSCALL_DEFINE2(clock_settime32, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
{
|
||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timespec64 ts;
|
||||
@@ -1105,8 +1111,8 @@ COMPAT_SYSCALL_DEFINE2(clock_settime, clockid_t, which_clock,
|
||||
return kc->clock_set(which_clock, &ts);
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
SYSCALL_DEFINE2(clock_gettime32, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
{
|
||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timespec64 ts;
|
||||
@@ -1123,40 +1129,26 @@ COMPAT_SYSCALL_DEFINE2(clock_gettime, clockid_t, which_clock,
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(clock_adjtime, clockid_t, which_clock,
|
||||
struct compat_timex __user *, utp)
|
||||
SYSCALL_DEFINE2(clock_adjtime32, clockid_t, which_clock,
|
||||
struct old_timex32 __user *, utp)
|
||||
{
|
||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timex ktx;
|
||||
struct __kernel_timex ktx;
|
||||
int err;
|
||||
|
||||
if (!kc)
|
||||
return -EINVAL;
|
||||
if (!kc->clock_adj)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
err = compat_get_timex(&ktx, utp);
|
||||
err = get_old_timex32(&ktx, utp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = kc->clock_adj(which_clock, &ktx);
|
||||
err = do_clock_adjtime(which_clock, &ktx);
|
||||
|
||||
if (err >= 0)
|
||||
err = compat_put_timex(utp, &ktx);
|
||||
err = put_old_timex32(utp, &ktx);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
|
||||
COMPAT_SYSCALL_DEFINE2(clock_getres, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
SYSCALL_DEFINE2(clock_getres_time32, clockid_t, which_clock,
|
||||
struct old_timespec32 __user *, tp)
|
||||
{
|
||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timespec64 ts;
|
||||
@@ -1212,9 +1204,9 @@ SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
|
||||
COMPAT_SYSCALL_DEFINE4(clock_nanosleep, clockid_t, which_clock, int, flags,
|
||||
struct old_timespec32 __user *, rqtp,
|
||||
struct old_timespec32 __user *, rmtp)
|
||||
SYSCALL_DEFINE4(clock_nanosleep_time32, clockid_t, which_clock, int, flags,
|
||||
struct old_timespec32 __user *, rqtp,
|
||||
struct old_timespec32 __user *, rmtp)
|
||||
{
|
||||
const struct k_clock *kc = clockid_to_kclock(which_clock);
|
||||
struct timespec64 t;
|
||||
|
@@ -8,7 +8,7 @@ struct k_clock {
|
||||
const struct timespec64 *tp);
|
||||
int (*clock_get)(const clockid_t which_clock,
|
||||
struct timespec64 *tp);
|
||||
int (*clock_adj)(const clockid_t which_clock, struct timex *tx);
|
||||
int (*clock_adj)(const clockid_t which_clock, struct __kernel_timex *tx);
|
||||
int (*timer_create)(struct k_itimer *timer);
|
||||
int (*nsleep)(const clockid_t which_clock, int flags,
|
||||
const struct timespec64 *);
|
||||
|
@@ -98,11 +98,11 @@ SYSCALL_DEFINE1(stime, time_t __user *, tptr)
|
||||
|
||||
#endif /* __ARCH_WANT_SYS_TIME */
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
#ifdef __ARCH_WANT_COMPAT_SYS_TIME
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
#ifdef __ARCH_WANT_SYS_TIME32
|
||||
|
||||
/* old_time32_t is a 32 bit "long" and needs to get converted. */
|
||||
COMPAT_SYSCALL_DEFINE1(time, old_time32_t __user *, tloc)
|
||||
SYSCALL_DEFINE1(time32, old_time32_t __user *, tloc)
|
||||
{
|
||||
old_time32_t i;
|
||||
|
||||
@@ -116,7 +116,7 @@ COMPAT_SYSCALL_DEFINE1(time, old_time32_t __user *, tloc)
|
||||
return i;
|
||||
}
|
||||
|
||||
COMPAT_SYSCALL_DEFINE1(stime, old_time32_t __user *, tptr)
|
||||
SYSCALL_DEFINE1(stime32, old_time32_t __user *, tptr)
|
||||
{
|
||||
struct timespec64 tv;
|
||||
int err;
|
||||
@@ -134,7 +134,7 @@ COMPAT_SYSCALL_DEFINE1(stime, old_time32_t __user *, tptr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* __ARCH_WANT_COMPAT_SYS_TIME */
|
||||
#endif /* __ARCH_WANT_SYS_TIME32 */
|
||||
#endif
|
||||
|
||||
SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
|
||||
@@ -263,35 +263,99 @@ COMPAT_SYSCALL_DEFINE2(settimeofday, struct old_timeval32 __user *, tv,
|
||||
}
|
||||
#endif
|
||||
|
||||
SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
|
||||
#if !defined(CONFIG_64BIT_TIME) || defined(CONFIG_64BIT)
|
||||
SYSCALL_DEFINE1(adjtimex, struct __kernel_timex __user *, txc_p)
|
||||
{
|
||||
struct timex txc; /* Local copy of parameter */
|
||||
struct __kernel_timex txc; /* Local copy of parameter */
|
||||
int ret;
|
||||
|
||||
/* Copy the user data space into the kernel copy
|
||||
* structure. But bear in mind that the structures
|
||||
* may change
|
||||
*/
|
||||
if (copy_from_user(&txc, txc_p, sizeof(struct timex)))
|
||||
if (copy_from_user(&txc, txc_p, sizeof(struct __kernel_timex)))
|
||||
return -EFAULT;
|
||||
ret = do_adjtimex(&txc);
|
||||
return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;
|
||||
return copy_to_user(txc_p, &txc, sizeof(struct __kernel_timex)) ? -EFAULT : ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_COMPAT_32BIT_TIME
|
||||
int get_old_timex32(struct __kernel_timex *txc, const struct old_timex32 __user *utp)
|
||||
{
|
||||
struct old_timex32 tx32;
|
||||
|
||||
memset(txc, 0, sizeof(struct __kernel_timex));
|
||||
if (copy_from_user(&tx32, utp, sizeof(struct old_timex32)))
|
||||
return -EFAULT;
|
||||
|
||||
txc->modes = tx32.modes;
|
||||
txc->offset = tx32.offset;
|
||||
txc->freq = tx32.freq;
|
||||
txc->maxerror = tx32.maxerror;
|
||||
txc->esterror = tx32.esterror;
|
||||
txc->status = tx32.status;
|
||||
txc->constant = tx32.constant;
|
||||
txc->precision = tx32.precision;
|
||||
txc->tolerance = tx32.tolerance;
|
||||
txc->time.tv_sec = tx32.time.tv_sec;
|
||||
txc->time.tv_usec = tx32.time.tv_usec;
|
||||
txc->tick = tx32.tick;
|
||||
txc->ppsfreq = tx32.ppsfreq;
|
||||
txc->jitter = tx32.jitter;
|
||||
txc->shift = tx32.shift;
|
||||
txc->stabil = tx32.stabil;
|
||||
txc->jitcnt = tx32.jitcnt;
|
||||
txc->calcnt = tx32.calcnt;
|
||||
txc->errcnt = tx32.errcnt;
|
||||
txc->stbcnt = tx32.stbcnt;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_COMPAT
|
||||
|
||||
COMPAT_SYSCALL_DEFINE1(adjtimex, struct compat_timex __user *, utp)
|
||||
int put_old_timex32(struct old_timex32 __user *utp, const struct __kernel_timex *txc)
|
||||
{
|
||||
struct timex txc;
|
||||
struct old_timex32 tx32;
|
||||
|
||||
memset(&tx32, 0, sizeof(struct old_timex32));
|
||||
tx32.modes = txc->modes;
|
||||
tx32.offset = txc->offset;
|
||||
tx32.freq = txc->freq;
|
||||
tx32.maxerror = txc->maxerror;
|
||||
tx32.esterror = txc->esterror;
|
||||
tx32.status = txc->status;
|
||||
tx32.constant = txc->constant;
|
||||
tx32.precision = txc->precision;
|
||||
tx32.tolerance = txc->tolerance;
|
||||
tx32.time.tv_sec = txc->time.tv_sec;
|
||||
tx32.time.tv_usec = txc->time.tv_usec;
|
||||
tx32.tick = txc->tick;
|
||||
tx32.ppsfreq = txc->ppsfreq;
|
||||
tx32.jitter = txc->jitter;
|
||||
tx32.shift = txc->shift;
|
||||
tx32.stabil = txc->stabil;
|
||||
tx32.jitcnt = txc->jitcnt;
|
||||
tx32.calcnt = txc->calcnt;
|
||||
tx32.errcnt = txc->errcnt;
|
||||
tx32.stbcnt = txc->stbcnt;
|
||||
tx32.tai = txc->tai;
|
||||
if (copy_to_user(utp, &tx32, sizeof(struct old_timex32)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
SYSCALL_DEFINE1(adjtimex_time32, struct old_timex32 __user *, utp)
|
||||
{
|
||||
struct __kernel_timex txc;
|
||||
int err, ret;
|
||||
|
||||
err = compat_get_timex(&txc, utp);
|
||||
err = get_old_timex32(&txc, utp);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
ret = do_adjtimex(&txc);
|
||||
|
||||
err = compat_put_timex(utp, &txc);
|
||||
err = put_old_timex32(utp, &txc);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
|
@@ -2234,7 +2234,7 @@ ktime_t ktime_get_update_offsets_now(unsigned int *cwsseq, ktime_t *offs_real,
|
||||
/**
|
||||
* timekeeping_validate_timex - Ensures the timex is ok for use in do_adjtimex
|
||||
*/
|
||||
static int timekeeping_validate_timex(const struct timex *txc)
|
||||
static int timekeeping_validate_timex(const struct __kernel_timex *txc)
|
||||
{
|
||||
if (txc->modes & ADJ_ADJTIME) {
|
||||
/* singleshot must not be used with any other mode bits */
|
||||
@@ -2300,7 +2300,7 @@ static int timekeeping_validate_timex(const struct timex *txc)
|
||||
/**
|
||||
* do_adjtimex() - Accessor function to NTP __do_adjtimex function
|
||||
*/
|
||||
int do_adjtimex(struct timex *txc)
|
||||
int do_adjtimex(struct __kernel_timex *txc)
|
||||
{
|
||||
struct timekeeper *tk = &tk_core.timekeeper;
|
||||
unsigned long flags;
|
||||
|
Reference in New Issue
Block a user