nfds: avoid gettimeofday for nfssvc_boot time

do_gettimeofday() is deprecated and we should generally use time64_t
based functions instead.

In case of nfsd, all three users of nfssvc_boot only use the initial
time as a unique token, and are not affected by it overflowing, so they
are not affected by the y2038 overflow.

This converts the structure to timespec64 anyway and adds comments
to all uses, to document that we have thought about it and avoid
having to look at it again.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
Arnd Bergmann 2017-10-19 12:04:11 +02:00 committed by J. Bruce Fields
parent 818a34eb26
commit 256a89fa3d
4 changed files with 11 additions and 8 deletions

View File

@ -107,7 +107,7 @@ struct nfsd_net {
bool lockd_up; bool lockd_up;
/* Time of server startup */ /* Time of server startup */
struct timeval nfssvc_boot; struct timespec64 nfssvc_boot;
/* /*
* Max number of connections this nfsd container will allow. Defaults * Max number of connections this nfsd container will allow. Defaults

View File

@ -747,8 +747,9 @@ nfs3svc_encode_writeres(struct svc_rqst *rqstp, __be32 *p)
if (resp->status == 0) { if (resp->status == 0) {
*p++ = htonl(resp->count); *p++ = htonl(resp->count);
*p++ = htonl(resp->committed); *p++ = htonl(resp->committed);
*p++ = htonl(nn->nfssvc_boot.tv_sec); /* unique identifier, y2038 overflow can be ignored */
*p++ = htonl(nn->nfssvc_boot.tv_usec); *p++ = htonl((u32)nn->nfssvc_boot.tv_sec);
*p++ = htonl(nn->nfssvc_boot.tv_nsec);
} }
return xdr_ressize_check(rqstp, p); return xdr_ressize_check(rqstp, p);
} }
@ -1118,8 +1119,9 @@ nfs3svc_encode_commitres(struct svc_rqst *rqstp, __be32 *p)
p = encode_wcc_data(rqstp, p, &resp->fh); p = encode_wcc_data(rqstp, p, &resp->fh);
/* Write verifier */ /* Write verifier */
if (resp->status == 0) { if (resp->status == 0) {
*p++ = htonl(nn->nfssvc_boot.tv_sec); /* unique identifier, y2038 overflow can be ignored */
*p++ = htonl(nn->nfssvc_boot.tv_usec); *p++ = htonl((u32)nn->nfssvc_boot.tv_sec);
*p++ = htonl(nn->nfssvc_boot.tv_nsec);
} }
return xdr_ressize_check(rqstp, p); return xdr_ressize_check(rqstp, p);
} }

View File

@ -564,10 +564,11 @@ static void gen_boot_verifier(nfs4_verifier *verifier, struct net *net)
/* /*
* This is opaque to client, so no need to byte-swap. Use * This is opaque to client, so no need to byte-swap. Use
* __force to keep sparse happy * __force to keep sparse happy. y2038 time_t overflow is
* irrelevant in this usage.
*/ */
verf[0] = (__force __be32)nn->nfssvc_boot.tv_sec; verf[0] = (__force __be32)nn->nfssvc_boot.tv_sec;
verf[1] = (__force __be32)nn->nfssvc_boot.tv_usec; verf[1] = (__force __be32)nn->nfssvc_boot.tv_nsec;
memcpy(verifier->data, verf, sizeof(verifier->data)); memcpy(verifier->data, verf, sizeof(verifier->data));
} }

View File

@ -516,7 +516,7 @@ int nfsd_create_serv(struct net *net)
register_inet6addr_notifier(&nfsd_inet6addr_notifier); register_inet6addr_notifier(&nfsd_inet6addr_notifier);
#endif #endif
} }
do_gettimeofday(&nn->nfssvc_boot); /* record boot time */ ktime_get_real_ts64(&nn->nfssvc_boot); /* record boot time */
return 0; return 0;
} }