diff options
author | James Morris <james.l.morris@oracle.com> | 2012-09-28 13:37:32 +1000 |
---|---|---|
committer | James Morris <james.l.morris@oracle.com> | 2012-09-28 13:37:32 +1000 |
commit | bf5308344527d015ac9a6d2bda4ad4d40fd7d943 (patch) | |
tree | 566e61e2cfc648c374d15cfc8c661b73e1a471f8 /include/linux/time.h | |
parent | 3585e96cd1049682b8a19a0b699422156e9d735b (diff) | |
parent | 979570e02981d4a8fc20b3cc8fd651856c98ee9d (diff) | |
download | linux-stable-bf5308344527d015ac9a6d2bda4ad4d40fd7d943.tar.gz linux-stable-bf5308344527d015ac9a6d2bda4ad4d40fd7d943.tar.bz2 linux-stable-bf5308344527d015ac9a6d2bda4ad4d40fd7d943.zip |
Merge tag 'v3.6-rc7' into next
Linux 3.6-rc7
Requested by David Howells so he can merge his key susbsystem work into
my tree with requisite -linus changesets.
Diffstat (limited to 'include/linux/time.h')
-rw-r--r-- | include/linux/time.h | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/include/linux/time.h b/include/linux/time.h index c81c5e40fcb5..b51e664c83e7 100644 --- a/include/linux/time.h +++ b/include/linux/time.h @@ -107,11 +107,36 @@ static inline struct timespec timespec_sub(struct timespec lhs, return ts_delta; } +#define KTIME_MAX ((s64)~((u64)1 << 63)) +#if (BITS_PER_LONG == 64) +# define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) +#else +# define KTIME_SEC_MAX LONG_MAX +#endif + /* * Returns true if the timespec is norm, false if denorm: */ -#define timespec_valid(ts) \ - (((ts)->tv_sec >= 0) && (((unsigned long) (ts)->tv_nsec) < NSEC_PER_SEC)) +static inline bool timespec_valid(const struct timespec *ts) +{ + /* Dates before 1970 are bogus */ + if (ts->tv_sec < 0) + return false; + /* Can't have more nanoseconds then a second */ + if ((unsigned long)ts->tv_nsec >= NSEC_PER_SEC) + return false; + return true; +} + +static inline bool timespec_valid_strict(const struct timespec *ts) +{ + if (!timespec_valid(ts)) + return false; + /* Disallow values that could overflow ktime_t */ + if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX) + return false; + return true; +} extern void read_persistent_clock(struct timespec *ts); extern void read_boot_clock(struct timespec *ts); |