| From 629eca0ad9f950fa00c823cd991db167dd140156 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 14 Aug 2018 15:18:20 +0200 |
| Subject: y2038: make do_gettimeofday() and get_seconds() inline |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit 33e26418193f58d1895f2f968e1953b1caf8deb7 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| include/linux/timekeeping32.h | 15 +++++++++++++-- |
| kernel/time/time.c | 15 +++++++++------ |
| kernel/time/timekeeping.c | 24 ------------------------ |
| 3 files changed, 22 insertions(+), 32 deletions(-) |
| |
| diff --git a/include/linux/timekeeping32.h b/include/linux/timekeeping32.h |
| index 8762c2f45f8bf..479da36be8c82 100644 |
| --- a/include/linux/timekeeping32.h |
| +++ b/include/linux/timekeeping32.h |
| @@ -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 struct timespec current_kernel_time(void) |
| { |
| diff --git a/kernel/time/time.c b/kernel/time/time.c |
| index be057d6579f13..f7d4fa5ddb9e2 100644 |
| --- a/kernel/time/time.c |
| +++ b/kernel/time/time.c |
| @@ -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) { |
| diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c |
| index c2708e1f0c69f..81ee5b83c9200 100644 |
| --- a/kernel/time/timekeeping.c |
| +++ b/kernel/time/timekeeping.c |
| @@ -1214,22 +1214,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 |
| @@ -2177,14 +2161,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; |
| -- |
| 2.20.1 |
| |