SUNRPC: return proper error from get_expiry()
authorNeilBrown <neilb@suse.de>
Wed, 8 Mar 2023 06:51:00 +0000 (17:51 +1100)
committerChuck Lever <chuck.lever@oracle.com>
Wed, 26 Apr 2023 13:05:00 +0000 (09:05 -0400)
commitcf64b9bce95095b80f4589e4f54572cc5d8c1538
treec431f8564e166026b82255b0c66fca2319020b91
parent2f90e18ffec47c265c14e313047189b79784bc0e
SUNRPC: return proper error from get_expiry()

The get_expiry() function currently returns a timestamp, and uses the
special return value of 0 to indicate an error.

Unfortunately this causes a problem when 0 is the correct return value.

On a system with no RTC it is possible that the boot time will be seen
to be "3".  When exportfs probes to see if a particular filesystem
supports NFS export it tries to cache information with an expiry time of
"3".  The intention is for this to be "long in the past".  Even with no
RTC it will not be far in the future (at most a second or two) so this
is harmless.
But if the boot time happens to have been calculated to be "3", then
get_expiry will fail incorrectly as it converts the number to "seconds
since bootime" - 0.

To avoid this problem we change get_expiry() to report the error quite
separately from the expiry time.  The error is now the return value.
The expiry time is reported through a by-reference parameter.

Reported-by: Jerry Zhang <jerry@skydio.com>
Tested-by: Jerry Zhang <jerry@skydio.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/export.c
fs/nfsd/nfs4idmap.c
include/linux/sunrpc/cache.h
net/sunrpc/auth_gss/svcauth_gss.c
net/sunrpc/svcauth_unix.c