• Wang YanQing's avatar
    time: Always make sure wall_to_monotonic isn't positive · e1d7ba87
    Wang YanQing authored
    Two issues were found on an IMX6 development board without an
    enabled RTC device(resulting in the boot time and monotonic
    time being initialized to 0).
    
    Issue 1:exportfs -a generate:
           "exportfs: /opt/nfs/arm does not support NFS export"
    Issue 2:cat /proc/stat:
           "btime 4294967236"
    
    The same issues can be reproduced on x86 after running the
    following code:
    	int main(void)
    	{
    	    struct timeval val;
    	    int ret;
    
    	    val.tv_sec = 0;
    	    val.tv_usec = 0;
    	    ret = settimeofday(&val, NULL);
    	    return 0;
    	}
    
    Two issues are different symptoms of same problem:
    The reason is a positive wall_to_monotonic pushes boot time back
    to the time before Epoch, and getboottime will return negative
    value.
    
    In symptom 1:
              negative boot time cause get_expiry() to overflow time_t
              when input expire time is 2147483647, then cache_flush()
              always clears entries just added in ip_map_parse.
    In symptom 2:
              show_stat() uses "unsigned long" to print negative btime
              value returned by getboottime.
    
    This patch fix the problem by prohibiting time from being set to a value which
    would cause a negative boot time. As a result one can't set the CLOCK_REALTIME
    time prior to (1970 + system uptime).
    
    Cc: Prarit Bhargava <prarit@redhat.com>
    Cc: Richard Cochran <richardcochran@gmail.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarWang YanQing <udknight@gmail.com>
    [jstultz: reworded commit message]
    Signed-off-by: default avatarJohn Stultz <john.stultz@linaro.org>
    e1d7ba87
timekeeping.c 55.3 KB