25-akpm/arch/alpha/kernel/time.c |   33 +++++++++++++++++++--------------
 1 files changed, 19 insertions(+), 14 deletions(-)

diff -puN arch/alpha/kernel/time.c~alpha-do_settimeofday-update arch/alpha/kernel/time.c
--- 25/arch/alpha/kernel/time.c~alpha-do_settimeofday-update	Wed Jun 11 15:09:33 2003
+++ 25-akpm/arch/alpha/kernel/time.c	Wed Jun 11 15:11:57 2003
@@ -445,12 +445,15 @@ do_gettimeofday(struct timeval *tv)
 	tv->tv_usec = usec;
 }
 
-void
-do_settimeofday(struct timeval *tv)
+int
+do_settimeofday(struct timespec *tv)
 {
-	unsigned long delta_usec;
-	long sec, usec;
-	
+	unsigned long delta_nsec;
+	long sec, nsec;
+
+	if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
+		return -EINVAL;
+
 	write_seqlock_irq(&xtime_lock);
 
 	/* The offset that is added into time in do_gettimeofday above
@@ -458,31 +461,33 @@ do_settimeofday(struct timeval *tv)
 	   time.  Without this, a full-tick error is possible.  */
 
 #ifdef CONFIG_SMP
-	delta_usec = (jiffies - wall_jiffies) * (1000000 / HZ);
+	delta_nsec = (jiffies - wall_jiffies) * (NSEC_PER_SEC / HZ);
 #else
-	delta_usec = rpcc() - state.last_time;
-	delta_usec = (delta_usec * state.scaled_ticks_per_cycle 
+	delta_nsec = rpcc() - state.last_time;
+	delta_nsec = (delta_nsec * state.scaled_ticks_per_cycle 
 		      + state.partial_tick
 		      + ((jiffies - wall_jiffies) << FIX_SHIFT)) * 15625;
-	delta_usec = ((delta_usec / ((1UL << (FIX_SHIFT-6-1)) * HZ)) + 1) / 2;
+	delta_nsec = ((delta_nsec / ((1UL << (FIX_SHIFT-6-1)) * HZ)) + 1) / 2;
+	delta_nsec *= 1000;
 #endif
 
 	sec = tv->tv_sec;
-	usec = tv->tv_usec;
-	usec -= delta_usec;
-	if (usec < 0) {
-		usec += 1000000;
+	nsec = tv->tv_nsec;
+	nsec -= delta_nsec;
+	if (nsec < 0) {
+		nsec += NSEC_PER_SEC;
 		sec -= 1;
 	}
 
 	xtime.tv_sec = sec;
-	xtime.tv_nsec = (usec / 1000);
+	xtime.tv_nsec = 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;
 }
 
 

_