25-akpm/arch/sparc64/kernel/time.c |   21 ++++++++++++---------
 1 files changed, 12 insertions(+), 9 deletions(-)

diff -puN arch/sparc64/kernel/time.c~sparc64-do_settimeofday-update arch/sparc64/kernel/time.c
--- 25/arch/sparc64/kernel/time.c~sparc64-do_settimeofday-update	Wed Jun 11 14:56:18 2003
+++ 25-akpm/arch/sparc64/kernel/time.c	Wed Jun 11 14:58:40 2003
@@ -1088,10 +1088,13 @@ static __inline__ unsigned long do_getti
 	return (ticks * timer_ticks_per_usec_quotient) >> 30UL;
 }
 
-void do_settimeofday(struct timeval *tv)
+int do_settimeofday(struct timespec *tv)
 {
+	if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
+		return -EINVAL;
+
 	if (this_is_starfire)
-		return;
+		return 0;
 
 	write_seqlock_irq(&xtime_lock);
 	/*
@@ -1100,17 +1103,16 @@ 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) * (USEC_PER_SEC / HZ);
+	tv->tv_nsec -= do_gettimeoffset() * 1000;
+	tv->tv_nsec -= (jiffies - wall_jiffies) * (NSEC_PER_SEC / HZ);
 
-	while (tv->tv_usec < 0) {
-		tv->tv_usec += USEC_PER_SEC;
+	while (tv->tv_nsec < 0) {
+		tv->tv_nsec += NSEC_PER_SEC;
 		tv->tv_sec--;
 	}
-	tv->tv_usec *= NSEC_PER_USEC;
 
 	wall_to_monotonic.tv_sec += xtime.tv_sec - tv->tv_sec;
-	wall_to_monotonic.tv_nsec += xtime.tv_nsec - tv->tv_usec;
+	wall_to_monotonic.tv_nsec += xtime.tv_nsec - tv->tv_nsec;
 
 	if (wall_to_monotonic.tv_nsec > NSEC_PER_SEC) {
 		wall_to_monotonic.tv_nsec -= NSEC_PER_SEC;
@@ -1122,12 +1124,13 @@ void do_settimeofday(struct timeval *tv)
 	}
 
 	xtime.tv_sec = tv->tv_sec;
-	xtime.tv_nsec = tv->tv_usec;
+	xtime.tv_nsec = tv->tv_nsec;
 	time_adjust = 0;		/* stop active adjtime() */
 	time_status |= STA_UNSYNC;
 	time_maxerror = NTP_PHASE_LIMIT;
 	time_esterror = NTP_PHASE_LIMIT;
 	write_sequnlock_irq(&xtime_lock);
+	return 0;
 }
 
 /* Ok, my cute asm atomicity trick doesn't work anymore.

_