y2038: timerfd: Use timespec64 internally
authorArnd Bergmann <arnd@arndb.de>
Fri, 20 Apr 2018 20:03:38 +0000 (22:03 +0200)
committerArnd Bergmann <arnd@arndb.de>
Fri, 15 Nov 2019 13:38:30 +0000 (14:38 +0100)
timerfd_show() uses a 'struct itimerspec' internally, but that is
deprecated because of the time_t overflow and a conflict with the glibc
type of the same name that is now incompatible in user space.

Use a pair of timespec64 variables instead as a simple replacement.

As this removes the last use of itimerspec from the kernel, allowing the
removal of the definition from the uapi headers along with timespec and
timeval later.

Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
fs/timerfd.c

index 48305ba..ac7f59a 100644 (file)
@@ -302,11 +302,11 @@ static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count,
 static void timerfd_show(struct seq_file *m, struct file *file)
 {
        struct timerfd_ctx *ctx = file->private_data;
-       struct itimerspec t;
+       struct timespec64 value, interval;
 
        spin_lock_irq(&ctx->wqh.lock);
-       t.it_value = ktime_to_timespec(timerfd_get_remaining(ctx));
-       t.it_interval = ktime_to_timespec(ctx->tintv);
+       value = ktime_to_timespec64(timerfd_get_remaining(ctx));
+       interval = ktime_to_timespec64(ctx->tintv);
        spin_unlock_irq(&ctx->wqh.lock);
 
        seq_printf(m,
@@ -318,10 +318,10 @@ static void timerfd_show(struct seq_file *m, struct file *file)
                   ctx->clockid,
                   (unsigned long long)ctx->ticks,
                   ctx->settime_flags,
-                  (unsigned long long)t.it_value.tv_sec,
-                  (unsigned long long)t.it_value.tv_nsec,
-                  (unsigned long long)t.it_interval.tv_sec,
-                  (unsigned long long)t.it_interval.tv_nsec);
+                  (unsigned long long)value.tv_sec,
+                  (unsigned long long)value.tv_nsec,
+                  (unsigned long long)interval.tv_sec,
+                  (unsigned long long)interval.tv_nsec);
 }
 #else
 #define timerfd_show NULL