y2038: sparc: remove use of struct timex
'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>
This commit is contained in:
Родитель
4f9fbd893f
Коммит
251ec1c159
|
@ -548,34 +548,35 @@ out_unlock:
|
||||||
return err;
|
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 txc;
|
||||||
struct __kernel_timex *kt = (void *)&txc;
|
struct __kernel_old_timeval *tv = (void *)&txc_p->time;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Copy the user data space into the kernel copy
|
/* Copy the user data space into the kernel copy
|
||||||
* structure. But bear in mind that the structures
|
* structure. But bear in mind that the structures
|
||||||
* may change
|
* may change
|
||||||
*/
|
*/
|
||||||
if (copy_from_user(&txc, txc_p, sizeof(struct timex)))
|
if (copy_from_user(&txc, txc_p, sizeof(txc)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* override for sparc64 specific timeval type: tv_usec
|
* override for sparc64 specific timeval type: tv_usec
|
||||||
* is 32 bit wide instead of 64-bit in __kernel_timex
|
* is 32 bit wide instead of 64-bit in __kernel_timex
|
||||||
*/
|
*/
|
||||||
kt->time.tv_usec = txc.time.tv_usec;
|
txc.time.tv_usec = tv->tv_usec;
|
||||||
ret = do_adjtimex(kt);
|
ret = do_adjtimex(&txc);
|
||||||
txc.time.tv_usec = kt->time.tv_usec;
|
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 txc;
|
||||||
struct __kernel_timex *kt = (void *)&txc;
|
struct __kernel_old_timeval *tv = (void *)&txc_p->time;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_POSIX_TIMERS)) {
|
if (!IS_ENABLED(CONFIG_POSIX_TIMERS)) {
|
||||||
|
@ -590,18 +591,18 @@ SYSCALL_DEFINE2(sparc_clock_adjtime, const clockid_t, which_clock,struct timex _
|
||||||
* structure. But bear in mind that the structures
|
* structure. But bear in mind that the structures
|
||||||
* may change
|
* may change
|
||||||
*/
|
*/
|
||||||
if (copy_from_user(&txc, txc_p, sizeof(struct timex)))
|
if (copy_from_user(&txc, txc_p, sizeof(txc)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* override for sparc64 specific timeval type: tv_usec
|
* override for sparc64 specific timeval type: tv_usec
|
||||||
* is 32 bit wide instead of 64-bit in __kernel_timex
|
* is 32 bit wide instead of 64-bit in __kernel_timex
|
||||||
*/
|
*/
|
||||||
kt->time.tv_usec = txc.time.tv_usec;
|
txc.time.tv_usec = tv->tv_usec;
|
||||||
ret = do_clock_adjtime(which_clock, kt);
|
ret = do_clock_adjtime(which_clock, &txc);
|
||||||
txc.time.tv_usec = kt->time.tv_usec;
|
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,
|
SYSCALL_DEFINE5(utrap_install, utrap_entry_t, type,
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
|
|
||||||
#define NTP_API 4 /* NTP API version */
|
#define NTP_API 4 /* NTP API version */
|
||||||
|
|
||||||
|
#ifndef __KERNEL__
|
||||||
/*
|
/*
|
||||||
* syscall interface - used (mainly by NTP daemon)
|
* syscall interface - used (mainly by NTP daemon)
|
||||||
* to discipline kernel clock oscillator
|
* 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; int :32;
|
||||||
int :32; int :32; int :32;
|
int :32; int :32; int :32;
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
struct __kernel_timex_timeval {
|
struct __kernel_timex_timeval {
|
||||||
__kernel_time64_t tv_sec;
|
__kernel_time64_t tv_sec;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче