time: Introduce do_sys_settimeofday64()
The do_sys_settimeofday() function uses a timespec, which is not year 2038 safe on 32bit systems. Thus this patch introduces do_sys_settimeofday64(), which allows us to transition users of do_sys_settimeofday() to using 64bit time types. Cc: Prarit Bhargava <prarit@redhat.com> Cc: Richard Cochran <richardcochran@gmail.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@kernel.org> Signed-off-by: Baolin Wang <baolin.wang@linaro.org> [jstultz: Include errno-base.h to avoid build issue on some arches] Signed-off-by: John Stultz <john.stultz@linaro.org>
This commit is contained in:
Родитель
457db29bfc
Коммит
86d3473224
|
@ -1,6 +1,8 @@
|
||||||
#ifndef _LINUX_TIMEKEEPING_H
|
#ifndef _LINUX_TIMEKEEPING_H
|
||||||
#define _LINUX_TIMEKEEPING_H
|
#define _LINUX_TIMEKEEPING_H
|
||||||
|
|
||||||
|
#include <asm-generic/errno-base.h>
|
||||||
|
|
||||||
/* Included from linux/ktime.h */
|
/* Included from linux/ktime.h */
|
||||||
|
|
||||||
void timekeeping_init(void);
|
void timekeeping_init(void);
|
||||||
|
@ -11,8 +13,19 @@ extern int timekeeping_suspended;
|
||||||
*/
|
*/
|
||||||
extern void do_gettimeofday(struct timeval *tv);
|
extern void do_gettimeofday(struct timeval *tv);
|
||||||
extern int do_settimeofday64(const struct timespec64 *ts);
|
extern int do_settimeofday64(const struct timespec64 *ts);
|
||||||
extern int do_sys_settimeofday(const struct timespec *tv,
|
extern int do_sys_settimeofday64(const struct timespec64 *tv,
|
||||||
const struct timezone *tz);
|
const struct timezone *tz);
|
||||||
|
static inline int do_sys_settimeofday(const struct timespec *tv,
|
||||||
|
const struct timezone *tz)
|
||||||
|
{
|
||||||
|
struct timespec64 ts64;
|
||||||
|
|
||||||
|
if (!tv)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
ts64 = timespec_to_timespec64(*tv);
|
||||||
|
return do_sys_settimeofday64(&ts64, tz);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Kernel time accessors
|
* Kernel time accessors
|
||||||
|
|
|
@ -160,15 +160,15 @@ static inline void warp_clock(void)
|
||||||
* various programs will get confused when the clock gets warped.
|
* various programs will get confused when the clock gets warped.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz)
|
int do_sys_settimeofday64(const struct timespec64 *tv, const struct timezone *tz)
|
||||||
{
|
{
|
||||||
static int firsttime = 1;
|
static int firsttime = 1;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
if (tv && !timespec_valid(tv))
|
if (tv && !timespec64_valid(tv))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
error = security_settime(tv, tz);
|
error = security_settime64(tv, tz);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -186,7 +186,7 @@ int do_sys_settimeofday(const struct timespec *tv, const struct timezone *tz)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tv)
|
if (tv)
|
||||||
return do_settimeofday(tv);
|
return do_settimeofday64(tv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче