25-akpm/arch/sh/kernel/time.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) diff -puN arch/sh/kernel/time.c~sh-do_settimeofday-update arch/sh/kernel/time.c --- 25/arch/sh/kernel/time.c~sh-do_settimeofday-update Wed Jun 11 15:20:44 2003 +++ 25-akpm/arch/sh/kernel/time.c Wed Jun 11 15:21:17 2003 @@ -151,8 +151,11 @@ void do_gettimeofday(struct timeval *tv) tv->tv_usec = usec; } -void do_settimeofday(struct timeval *tv) +int do_settimeofday(struct timespec *tv) { + if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) + return -EINVAL; + write_seqlock_irq(&xtime_lock); /* * This is revolting. We need to set "xtime" correctly. However, the @@ -160,11 +163,11 @@ void do_settimeofday(struct timeval *tv) * wall time. Discover what correction gettimeofday() would have * made, and then undo it! */ - tv->tv_usec -= do_gettimeoffset(); - tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ); + tv->tv_nsec -= 1000 * (do_gettimeoffset() + + (jiffies - wall_jiffies) * (1000000 / HZ)); - while (tv->tv_usec < 0) { - tv->tv_usec += 1000000; + while (tv->tv_nsec < 0) { + tv->tv_nsec += NSEC_PER_SEC; tv->tv_sec--; } @@ -174,6 +177,7 @@ void do_settimeofday(struct timeval *tv) time_maxerror = NTP_PHASE_LIMIT; time_esterror = NTP_PHASE_LIMIT; write_sequnlock_irq(&xtime_lock); + return 0; } /* last time the RTC clock got updated */ _