


 25-akpm/arch/ppc64/kernel/time.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)

diff -puN arch/ppc64/kernel/time.c~ppc64-do_settimeofday-update arch/ppc64/kernel/time.c
--- 25/arch/ppc64/kernel/time.c~ppc64-do_settimeofday-update	Wed Jun 11 14:39:56 2003
+++ 25-akpm/arch/ppc64/kernel/time.c	Wed Jun 11 14:44:16 2003
@@ -337,13 +337,16 @@ void do_gettimeofday(struct timeval *tv)
         tv->tv_usec = usec;
 }
 
-void do_settimeofday(struct timeval *tv)
+int do_settimeofday(struct timespec *tv)
 {
 	unsigned long flags;
 	unsigned long delta_xsec;
-	long int tb_delta, new_usec, new_sec;
+	long int tb_delta, new_nsec, new_sec;
 	unsigned long new_xsec;
 
+	if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
+		return -EINVAL;
+
 	write_seqlock_irqsave(&xtime_lock, flags);
 	/* Updating the RTC is not the job of this code. If the time is
 	 * stepped under NTP, the RTC will be update after STA_UNSYNC
@@ -362,12 +365,12 @@ void do_settimeofday(struct timeval *tv)
 	tb_delta += (jiffies - wall_jiffies) * tb_ticks_per_jiffy;
 
 	new_sec = tv->tv_sec;
-	new_usec = tv->tv_usec - tb_delta / tb_ticks_per_usec;
-	while (new_usec <0) {
+	new_nsec = tv->tv_nsec - (tb_delta / tb_ticks_per_usec / 1000);
+	while (new_nsec < 0) {
 		new_sec--; 
-		new_usec += USEC_PER_SEC;
+		new_nsec += NSEC_PER_SEC;
 	}
-	xtime.tv_nsec = new_usec * 1000;
+	xtime.tv_nsec = new_nsec;
 	xtime.tv_sec = new_sec;
 
 	/* In case of a large backwards jump in time with NTP, we want the 
@@ -381,7 +384,7 @@ void do_settimeofday(struct timeval *tv)
 	time_esterror = NTP_PHASE_LIMIT;
 
 	delta_xsec = mulhdu( (tb_last_stamp-do_gtod.tb_orig_stamp), do_gtod.varp->tb_to_xs );
-	new_xsec = (new_usec * XSEC_PER_SEC) / USEC_PER_SEC;
+	new_xsec = (new_nsec * XSEC_PER_SEC) / NSEC_PER_SEC;
 	new_xsec += new_sec * XSEC_PER_SEC;
 	if ( new_xsec > delta_xsec ) {
 		do_gtod.varp->stamp_xsec = new_xsec - delta_xsec;
@@ -396,6 +399,7 @@ void do_settimeofday(struct timeval *tv)
 	}
 
 	write_sequnlock_irqrestore(&xtime_lock, flags);
+	return 0;
 }
 
 /*

_
