fs: nfs: Make nfs boot time y2038 safe
Subsystems (2)
PATCH 1/1 fs: nfs: Make nfs boot time y2038 safe
boot_time is represented as a struct timespec. struct timespec and CURRENT_TIME are not y2038 safe. Overall, the plan is to use timespec64 and ktime_t for all internal kernel representation of timestamps. CURRENT_TIME will also be removed.
boot_time is used to construct the nfs client boot verifier.
Use ktime_t to represent boot_time and ktime_get_real() for the boot_time value.
Following Trond's request https://lkml.org/lkml/2016/6/9/22 , use ktime_t instead of converting to struct timespec64.
Use higher and lower 32 bit parts of ktime_t for the boot verifier.
Use the lower 32 bit part of ktime_t for the authsys_parms stamp field.
Signed-off-by Deepa Dinamani <[email protected]>
Reviewed-by Arnd Bergmann <[email protected]>
Cc Trond Myklebust <[email protected]>
Cc Anna Schumaker <[email protected]>
--- fs/nfs/client.c | 2 +- fs/nfs/netns.h | 2 +- fs/nfs/nfs4proc.c | 10 ++++++---- fs/nfs/nfs4xdr.c | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-)
fs/nfs/client.c +1 -1
@@ -1078,7 +1078,7 @@ void nfs_clients_init(struct net *net)idr_init (&nn->cb_ident_idr);#endif spin_lock_init (&nn->nfs_client_lock); - nn->boot_time =CURRENT_TIME ; + nn->boot_time =ktime_get_real (); }#ifdef CONFIG_PROC_FS
fs/nfs/netns.h +1 -1
@@ -29,7 +29,7 @@ struct nfs_net {int cb_users[NFS4_MAX_MINOR_VERSION +1 ];#endif spinlock_t nfs_client_lock; -struct timespec boot_time; +ktime_t boot_time;#ifdef CONFIG_PROC_FS struct proc_dir_entry *proc_nfsfs;#endif
fs/nfs/nfs4proc.c +6 -4
@@ -5123,12 +5123,14 @@ static void nfs4_init_boot_verifier(const struct nfs_client *clp,if (test_bit (NFS4CLNT_PURGE_STATE , &clp->cl_state)) {/* An impossible timestamp guarantees this value * will never match a generated boot time. */ - verf[0 ] =0 ; - verf[1 ] =cpu_to_be32 (NSEC_PER_SEC +1 ); + verf[0 ] =cpu_to_be32 (U32_MAX ); + verf[1 ] =cpu_to_be32 (U32_MAX ); }else {struct nfs_net *nn =net_generic (clp->cl_net, nfs_net_id); - verf[0 ] =cpu_to_be32 (nn->boot_time.tv_sec); - verf[1 ] =cpu_to_be32 (nn->boot_time.tv_nsec); +u64 ns =ktime_to_ns (nn->boot_time); + + verf[0 ] =cpu_to_be32 (ns >>32 ); + verf[1 ] =cpu_to_be32 (ns); }memcpy (bootverf->data, verf,sizeof (bootverf->data)); }
fs/nfs/nfs4xdr.c +1 -1
@@ -1850,7 +1850,7 @@ static void encode_create_session(struct xdr_stream *xdr, *p++ =cpu_to_be32 (RPC_AUTH_UNIX );/* auth_sys */ /* authsys_parms rfc1831 */ - *p++ =cpu_to_be32 (nn->boot_time.tv_nsec);/* stamp */ + *p++ =cpu_to_be32 (ktime_to_ns (nn->boot_time));/* stamp */ p =xdr_encode_array (p, clnt->cl_nodename, clnt->cl_nodelen); *p++ =cpu_to_be32 (0 );/* UID */ *p++ =cpu_to_be32 (0 );/* GID */
Signature · 1 line
2.7.4