


 25-akpm/arch/parisc/kernel/time.c |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diff -puN arch/parisc/kernel/time.c~parisc-do_settimeofday-update arch/parisc/kernel/time.c
--- 25/arch/parisc/kernel/time.c~parisc-do_settimeofday-update	Wed Jun 11 15:05:27 2003
+++ 25-akpm/arch/parisc/kernel/time.c	Wed Jun 11 15:06:50 2003
@@ -185,9 +185,12 @@ do_gettimeofday (struct timeval *tv)
 	tv->tv_usec = usec;
 }
 
-void
+int
 do_settimeofday (struct timeval *tv)
 {
+	if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
+		return -EINVAL;
+
 	write_seqlock_irq(&xtime_lock);
 	{
 		/*
@@ -197,22 +200,23 @@ do_settimeofday (struct timeval *tv)
 		 * Discover what correction gettimeofday would have
 		 * done, and then undo it!
 		 */
-		tv->tv_usec -= gettimeoffset();
-		tv->tv_usec -= (jiffies - wall_jiffies) * (1000000 / HZ);
+		tv->tv_nsec -= gettimeoffset() * 1000;
+		tv->tv_nsec -= (jiffies - wall_jiffies) * (NSEC_PER_SEC / HZ);
 
-		while (tv->tv_usec < 0) {
-			tv->tv_usec += 1000000;
+		while (tv->tv_nsec < 0) {
+			tv->tv_nsec += NSEC_PER_SEC;
 			tv->tv_sec--;
 		}
 
 		xtime.tv_sec = tv->tv_sec;
-		xtime.tv_nsec = (tv->tv_usec * 1000);
+		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;
 }
 
 

_
