staging/lustre: use 64-bit time LNetCtl()
authorArnd Bergmann <arnd@arndb.de>
Sun, 27 Sep 2015 20:45:10 +0000 (16:45 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 29 Sep 2015 02:03:35 +0000 (04:03 +0200)
This ioctl function passes a 64-bit time argument but then performs
a computation with a 32-bit get_seconds() value.

In order to avoid overflow here, this changes the code to use
64-bit math and ktime_get_real_seconds().

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Oleg Drokin <green@linuxhacker.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lnet/lnet/api-ni.c

index 7fab03bee1eaa4025e036877cbd1b3c90a60aaf3..c368cf561b9d5b09ee34a4994a0088057d002e75 100644 (file)
@@ -1343,6 +1343,7 @@ LNetCtl(unsigned int cmd, void *arg)
        lnet_process_id_t id = {0};
        lnet_ni_t *ni;
        int rc;
+       unsigned long secs_passed;
 
        LASSERT(the_lnet.ln_init);
        LASSERT(the_lnet.ln_refcount > 0);
@@ -1370,10 +1371,9 @@ LNetCtl(unsigned int cmd, void *arg)
                                      &data->ioc_nid, &data->ioc_flags,
                                      &data->ioc_priority);
        case IOC_LIBCFS_NOTIFY_ROUTER:
+               secs_passed = (ktime_get_real_seconds() - data->ioc_u64[0]);
                return lnet_notify(NULL, data->ioc_nid, data->ioc_flags,
-                                  cfs_time_current() -
-                                  cfs_time_seconds(get_seconds() -
-                                                   (time_t)data->ioc_u64[0]));
+                                  jiffies - secs_passed * HZ);
 
        case IOC_LIBCFS_PORTALS_COMPATIBILITY:
                /* This can be removed once lustre stops calling it */