y2038: sparc: remove use of struct timex
authorArnd Bergmann <arnd@arndb.de>
Mon, 16 Dec 2019 14:48:53 +0000 (15:48 +0100)
committerDavid S. Miller <davem@davemloft.net>
Thu, 30 Jan 2020 10:14:28 +0000 (11:14 +0100)
'struct timex' is one of the last users of 'struct timeval' and is
only referenced in one place in the kernel any more, to convert the
user space timex into the kernel-internal version on sparc64, with a
different tv_usec member type.

As a preparation for hiding the time_t definition and everything
using that in the kernel, change the implementation once more
to only convert the timeval member, and then enclose the
struct definition in an #ifdef.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Reviewed-by: Julian Calaby <julian.calaby@gmail.com>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/kernel/sys_sparc_64.c
include/uapi/linux/timex.h

index ccc88926bc000b9573af14f578d74098f7c7a8ff..9289ce9a574532a529c8d2351cc35186884141af 100644 (file)
@@ -545,34 +545,35 @@ out_unlock:
        return err;
 }
 
-SYSCALL_DEFINE1(sparc_adjtimex, struct timex __user *, txc_p)
+SYSCALL_DEFINE1(sparc_adjtimex, struct __kernel_timex __user *, txc_p)
 {
-       struct timex txc;               /* Local copy of parameter */
-       struct __kernel_timex *kt = (void *)&txc;
+       struct __kernel_timex txc;
+       struct __kernel_old_timeval *tv = (void *)&txc_p->time;
        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(txc)))
                return -EFAULT;
 
        /*
         * override for sparc64 specific timeval type: tv_usec
         * is 32 bit wide instead of 64-bit in __kernel_timex
         */
-       kt->time.tv_usec = txc.time.tv_usec;
-       ret = do_adjtimex(kt);
-       txc.time.tv_usec = kt->time.tv_usec;
+       txc.time.tv_usec = tv->tv_usec;
+       ret = do_adjtimex(&txc);
+       tv->tv_usec = txc.time.tv_usec;
 
-       return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;
+       return copy_to_user(txc_p, &txc, sizeof(txc)) ? -EFAULT : ret;
 }
 
-SYSCALL_DEFINE2(sparc_clock_adjtime, const clockid_t, which_clock,struct timex __user *, txc_p)
+SYSCALL_DEFINE2(sparc_clock_adjtime, const clockid_t, which_clock,
+               struct __kernel_timex __user *, txc_p)
 {
-       struct timex txc;               /* Local copy of parameter */
-       struct __kernel_timex *kt = (void *)&txc;
+       struct __kernel_timex txc;
+       struct __kernel_old_timeval *tv = (void *)&txc_p->time;
        int ret;
 
        if (!IS_ENABLED(CONFIG_POSIX_TIMERS)) {
@@ -587,18 +588,18 @@ SYSCALL_DEFINE2(sparc_clock_adjtime, const clockid_t, which_clock,struct timex _
         * 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(txc)))
                return -EFAULT;
 
        /*
         * override for sparc64 specific timeval type: tv_usec
         * is 32 bit wide instead of 64-bit in __kernel_timex
         */
-       kt->time.tv_usec = txc.time.tv_usec;
-       ret = do_clock_adjtime(which_clock, kt);
-       txc.time.tv_usec = kt->time.tv_usec;
+       txc.time.tv_usec = tv->tv_usec;
+       ret = do_clock_adjtime(which_clock, &txc);
+       tv->tv_usec = txc.time.tv_usec;
 
-       return copy_to_user(txc_p, &txc, sizeof(struct timex)) ? -EFAULT : ret;
+       return copy_to_user(txc_p, &txc, sizeof(txc)) ? -EFAULT : ret;
 }
 
 SYSCALL_DEFINE5(utrap_install, utrap_entry_t, type,
index 9f517f9010bb6c74c1d06fe72049c1c6200e14b4..bd627c368d0969f230c750885de8bc766daf6ff4 100644 (file)
@@ -57,6 +57,7 @@
 
 #define NTP_API                4       /* NTP API version */
 
+#ifndef __KERNEL__
 /*
  * syscall interface - used (mainly by NTP daemon)
  * to discipline kernel clock oscillator
@@ -91,6 +92,7 @@ struct timex {
        int  :32; int  :32; int  :32; int  :32;
        int  :32; int  :32; int  :32;
 };
+#endif
 
 struct __kernel_timex_timeval {
        __kernel_time64_t       tv_sec;