staging/lustre: use 64-bit timestamps for selftest
authorArnd Bergmann <arnd@arndb.de>
Sun, 27 Sep 2015 20:45:16 +0000 (16:45 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 29 Sep 2015 02:03:36 +0000 (04:03 +0200)
The wire protocol for the ping uses a 64-bit seconds/microseconds
pair, but this won't work when one side uses a 32-bit timeval
to look up the current time beyond 2038.

This changes the code to use ktime_get_real_ts64() to create
a timestamp that has the right format on all machines.

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/selftest/ping_test.c

index 1dab9984c58e0086546a7d1f58e856261cab3a44..d42653654fa87d33df07ed3f974850dae6c9a531 100644 (file)
@@ -92,7 +92,7 @@ ping_client_prep_rpc(sfw_test_unit_t *tsu,
        srpc_ping_reqst_t *req;
        sfw_test_instance_t *tsi = tsu->tsu_instance;
        sfw_session_t *sn = tsi->tsi_batch->bat_session;
-       struct timeval tv;
+       struct timespec64 ts;
        int rc;
 
        LASSERT(sn != NULL);
@@ -110,9 +110,9 @@ ping_client_prep_rpc(sfw_test_unit_t *tsu,
        req->pnr_seq = lst_ping_data.pnd_counter++;
        spin_unlock(&lst_ping_data.pnd_lock);
 
-       cfs_fs_timeval(&tv);
-       req->pnr_time_sec  = tv.tv_sec;
-       req->pnr_time_usec = tv.tv_usec;
+       ktime_get_real_ts64(&ts);
+       req->pnr_time_sec  = ts.tv_sec;
+       req->pnr_time_usec = ts.tv_nsec / NSEC_PER_USEC;
 
        return rc;
 }
@@ -124,7 +124,7 @@ ping_client_done_rpc(sfw_test_unit_t *tsu, srpc_client_rpc_t *rpc)
        sfw_session_t *sn = tsi->tsi_batch->bat_session;
        srpc_ping_reqst_t *reqst = &rpc->crpc_reqstmsg.msg_body.ping_reqst;
        srpc_ping_reply_t *reply = &rpc->crpc_replymsg.msg_body.ping_reply;
-       struct timeval tv;
+       struct timespec64 ts;
 
        LASSERT(sn != NULL);
 
@@ -161,10 +161,10 @@ ping_client_done_rpc(sfw_test_unit_t *tsu, srpc_client_rpc_t *rpc)
                return;
        }
 
-       cfs_fs_timeval(&tv);
+       ktime_get_real_ts64(&ts);
        CDEBUG(D_NET, "%d reply in %u usec\n", reply->pnr_seq,
-               (unsigned)((tv.tv_sec - (unsigned)reqst->pnr_time_sec) * 1000000
-                          + (tv.tv_usec - reqst->pnr_time_usec)));
+              (unsigned)((ts.tv_sec - reqst->pnr_time_sec) * 1000000 +
+                         (ts.tv_nsec / NSEC_PER_USEC - reqst->pnr_time_usec)));
        return;
 }