From d8f6c3473da1a29292ffe22e8b7c5d48639cb7ce Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Sat, 24 Jun 2006 16:05:18 +0000 Subject: [PATCH] --- yaml --- r: 31154 b: refs/heads/master c: 61c340166d8c62086b6de00afc7670eea27eb2ab h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/parisc/kernel/time.c | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index ba487633ec37..bb0a08a15c90 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6e1b9585aaae2fa4f9590f363b32c5d3b6339ba6 +refs/heads/master: 61c340166d8c62086b6de00afc7670eea27eb2ab diff --git a/trunk/arch/parisc/kernel/time.c b/trunk/arch/parisc/kernel/time.c index 594930bc4bcf..eb35e1c0bb53 100644 --- a/trunk/arch/parisc/kernel/time.c +++ b/trunk/arch/parisc/kernel/time.c @@ -157,8 +157,22 @@ do_gettimeofday (struct timeval *tv) usec += (xtime.tv_nsec / 1000); } while (read_seqretry_irqrestore(&xtime_lock, seq, flags)); - while (usec >= 1000000) { - usec -= 1000000; + if (unlikely(usec > LONG_MAX)) { + /* This can happen if the gettimeoffset adjustment is + * negative and xtime.tv_nsec is smaller than the + * adjustment */ + printk(KERN_ERR "do_gettimeofday() spurious xtime.tv_nsec of %ld\n", usec); + usec += USEC_PER_SEC; + --sec; + /* This should never happen, it means the negative + * time adjustment was more than a second, so there's + * something seriously wrong */ + BUG_ON(usec > LONG_MAX); + } + + + while (usec >= USEC_PER_SEC) { + usec -= USEC_PER_SEC; ++sec; }