]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - kernel/time.c
[PATCH] lpfc 8.1.3: Fix performance when using multiple SLI rings
[linux-2.6-omap-h63xx.git] / kernel / time.c
index a0502aef43ce826833c929fb3dcfa1331fb1dcac..804539165d8b1aea0ea0dac3631377d7ae107f89 100644 (file)
@@ -29,6 +29,7 @@
 
 #include <linux/module.h>
 #include <linux/timex.h>
+#include <linux/capability.h>
 #include <linux/errno.h>
 #include <linux/smp_lock.h>
 #include <linux/syscalls.h>
@@ -154,6 +155,9 @@ int do_sys_settimeofday(struct timespec *tv, struct timezone *tz)
        static int firsttime = 1;
        int error = 0;
 
+       if (tv && !timespec_valid(tv))
+               return -EINVAL;
+
        error = security_settime(tv, tz);
        if (error)
                return error;
@@ -561,28 +565,6 @@ void getnstimeofday(struct timespec *tv)
 EXPORT_SYMBOL_GPL(getnstimeofday);
 #endif
 
-void getnstimestamp(struct timespec *ts)
-{
-       unsigned int seq;
-       struct timespec wall2mono;
-
-       /* synchronize with settimeofday() changes */
-       do {
-               seq = read_seqbegin(&xtime_lock);
-               getnstimeofday(ts);
-               wall2mono = wall_to_monotonic;
-       } while(unlikely(read_seqretry(&xtime_lock, seq)));
-
-       /* adjust to monotonicaly-increasing values */
-       ts->tv_sec += wall2mono.tv_sec;
-       ts->tv_nsec += wall2mono.tv_nsec;
-       while (unlikely(ts->tv_nsec >= NSEC_PER_SEC)) {
-               ts->tv_nsec -= NSEC_PER_SEC;
-               ts->tv_sec++;
-       }
-}
-EXPORT_SYMBOL_GPL(getnstimestamp);
-
 /* Converts Gregorian date to seconds since 1970-01-01 00:00:00.
  * Assumes input in normal date format, i.e. 1980-12-31 23:59:59
  * => year=1980, mon=12, day=31, hour=23, min=59, sec=59.
@@ -619,6 +601,8 @@ mktime(const unsigned int year0, const unsigned int mon0,
        )*60 + sec; /* finally seconds */
 }
 
+EXPORT_SYMBOL(mktime);
+
 /**
  * set_normalized_timespec - set timespec sec and nsec parts and normalize
  *
@@ -647,6 +631,43 @@ void set_normalized_timespec(struct timespec *ts, time_t sec, long nsec)
        ts->tv_nsec = nsec;
 }
 
+/**
+ * ns_to_timespec - Convert nanoseconds to timespec
+ * @nsec:       the nanoseconds value to be converted
+ *
+ * Returns the timespec representation of the nsec parameter.
+ */
+struct timespec ns_to_timespec(const nsec_t nsec)
+{
+       struct timespec ts;
+
+       if (!nsec)
+               return (struct timespec) {0, 0};
+
+       ts.tv_sec = div_long_long_rem_signed(nsec, NSEC_PER_SEC, &ts.tv_nsec);
+       if (unlikely(nsec < 0))
+               set_normalized_timespec(&ts, ts.tv_sec, ts.tv_nsec);
+
+       return ts;
+}
+
+/**
+ * ns_to_timeval - Convert nanoseconds to timeval
+ * @nsec:       the nanoseconds value to be converted
+ *
+ * Returns the timeval representation of the nsec parameter.
+ */
+struct timeval ns_to_timeval(const nsec_t nsec)
+{
+       struct timespec ts = ns_to_timespec(nsec);
+       struct timeval tv;
+
+       tv.tv_sec = ts.tv_sec;
+       tv.tv_usec = (suseconds_t) ts.tv_nsec / 1000;
+
+       return tv;
+}
+
 #if (BITS_PER_LONG < 64)
 u64 get_jiffies_64(void)
 {