y2038: make do_gettimeofday() and get_seconds() inline
authorArnd Bergmann <arnd@arndb.de>
Tue, 14 Aug 2018 13:18:20 +0000 (15:18 +0200)
committerArnd Bergmann <arnd@arndb.de>
Mon, 27 Aug 2018 12:45:58 +0000 (14:45 +0200)
get_seconds() and do_gettimeofday() are only used by a few modules now any
more (waiting for the respective patches to get accepted), and they are
among the last holdouts of code that is not y2038 safe in the core kernel.

Move the implementation into the timekeeping32.h header to clean up
the core kernel and isolate the old interfaces further.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
include/linux/timekeeping32.h
kernel/time/time.c
kernel/time/timekeeping.c

index a4a4991160fb2f759581a6d94868cad8bd9458ba..a502616f7e1c517e057682a45b80dad433c36a29 100644 (file)
@@ -6,8 +6,19 @@
  * over time so we can remove the file here.
  */
 
-extern void do_gettimeofday(struct timeval *tv);
-unsigned long get_seconds(void);
+static inline void do_gettimeofday(struct timeval *tv)
+{
+       struct timespec64 now;
+
+       ktime_get_real_ts64(&now);
+       tv->tv_sec = now.tv_sec;
+       tv->tv_usec = now.tv_nsec/1000;
+}
+
+static inline unsigned long get_seconds(void)
+{
+       return ktime_get_real_seconds();
+}
 
 static inline void getnstimeofday(struct timespec *ts)
 {
index 7125430111067facc95930d930ed22efb91ee716..de332250d6faada8d246420e25acbf75ecfa8276 100644 (file)
@@ -144,9 +144,11 @@ SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
                struct timezone __user *, tz)
 {
        if (likely(tv != NULL)) {
-               struct timeval ktv;
-               do_gettimeofday(&ktv);
-               if (copy_to_user(tv, &ktv, sizeof(ktv)))
+               struct timespec64 ts;
+
+               ktime_get_real_ts64(&ts);
+               if (put_user(ts.tv_sec, &tv->tv_sec) ||
+                   put_user(ts.tv_nsec / 1000, &tv->tv_usec))
                        return -EFAULT;
        }
        if (unlikely(tz != NULL)) {
@@ -227,10 +229,11 @@ COMPAT_SYSCALL_DEFINE2(gettimeofday, struct compat_timeval __user *, tv,
                       struct timezone __user *, tz)
 {
        if (tv) {
-               struct timeval ktv;
+               struct timespec64 ts;
 
-               do_gettimeofday(&ktv);
-               if (compat_put_timeval(&ktv, tv))
+               ktime_get_real_ts64(&ts);
+               if (put_user(ts.tv_sec, &tv->tv_sec) ||
+                   put_user(ts.tv_nsec / 1000, &tv->tv_usec))
                        return -EFAULT;
        }
        if (tz) {
index f3b22f456fac7b61bf3f0e9e9fb29dcbcf9c630f..2d110c948805560c097939cab4456e3e9dad358a 100644 (file)
@@ -1211,22 +1211,6 @@ int get_device_system_crosststamp(int (*get_time_fn)
 }
 EXPORT_SYMBOL_GPL(get_device_system_crosststamp);
 
-/**
- * do_gettimeofday - Returns the time of day in a timeval
- * @tv:                pointer to the timeval to be set
- *
- * NOTE: Users should be converted to using getnstimeofday()
- */
-void do_gettimeofday(struct timeval *tv)
-{
-       struct timespec64 now;
-
-       getnstimeofday64(&now);
-       tv->tv_sec = now.tv_sec;
-       tv->tv_usec = now.tv_nsec/1000;
-}
-EXPORT_SYMBOL(do_gettimeofday);
-
 /**
  * do_settimeofday64 - Sets the time of day.
  * @ts:     pointer to the timespec64 variable containing the new time
@@ -2174,14 +2158,6 @@ void getboottime64(struct timespec64 *ts)
 }
 EXPORT_SYMBOL_GPL(getboottime64);
 
-unsigned long get_seconds(void)
-{
-       struct timekeeper *tk = &tk_core.timekeeper;
-
-       return tk->xtime_sec;
-}
-EXPORT_SYMBOL(get_seconds);
-
 void ktime_get_coarse_real_ts64(struct timespec64 *ts)
 {
        struct timekeeper *tk = &tk_core.timekeeper;