On Mon, 11 Nov 2013 18:20:34 +1100 Harshula Jayasuriya <harshula@xxxxxxxxxx> wrote: > This patch is the nfs-utils patch corresponding to the kernel patch > commit 2f74f972d4cc7d83408ea0c32d424edcb44887bf "sunrpc: prepare NFS > for 2038": "The kernel sunrpc code needs to handle seconds since epoch > greater than 2147483647. This means functions that parse time as an > int need to handle it as time_t." > > When appropriate exportfs should use LONG_MAX in can_test() instead of > INT_MAX. > > kernel INT_MAX + exportfs INT_MAX: "Tue Jan 19 03:14:08 UTC 2038" > ================================================================= > > exportfs: /mnt/export does not support NFS export: > ------------------------------------------------------------ > # cat /proc/net/rpc/auth.unix.ip/content > #class IP domain > ------------------------------------------------------------ > > + mount fail: > ------------------------------------------------------------ > # cat /proc/net/rpc/auth.unix.ip/content > #class IP domain > # expiry=2147483768 refcnt=2 flags=4 > # nfsd 192.168.1.6 -no-domain- > ------------------------------------------------------------ > > kernel LONG_MAX + exportfs INT_MAX: "Tue Jan 19 03:14:08 UTC 2038" > ================================================================== > > "exportfs: /mnt/export does not support NFS export": > ------------------------------------------------------------ > # cat /proc/net/rpc/auth.unix.ip/content > #class IP domain > ------------------------------------------------------------ > > + mount success: > ------------------------------------------------------------ > # cat /proc/net/rpc/auth.unix.ip/content > #class IP domain > # expiry=2147485448 refcnt=2 flags=1 > nfsd 192.168.1.6 * > ------------------------------------------------------------ > > kernel LONG_MAX + exportfs LONG_MAX: "Tue Jan 19 03:14:08 UTC 2038" > =================================================================== > > exportfs: > ------------------------------------------------------------ > # cat /proc/net/rpc/auth.unix.ip/content > #class IP domain > # expiry=9223372036854775807 refcnt=1 flags=1 > nfsd 0.0.0.0 -test-client- > ------------------------------------------------------------ > > + mount success: > ------------------------------------------------------------ > # cat /proc/net/rpc/auth.unix.ip/content > #class IP domain > # expiry=2147485448 refcnt=2 flags=1 > nfsd 192.168.1.6 * > # expiry=9223372036854775807 refcnt=1 flags=1 > nfsd 0.0.0.0 -test-client- > ------------------------------------------------------------ > > Signed-off-by: Harshula Jayasuriya <harshula@xxxxxxxxxx> > --- > utils/exportfs/exportfs.c | 20 ++++++++++++++++---- > 1 file changed, 16 insertions(+), 4 deletions(-) > > diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c > index da5fe21..bccbed5 100644 > --- a/utils/exportfs/exportfs.c > +++ b/utils/exportfs/exportfs.c > @@ -27,6 +27,8 @@ > #include <netdb.h> > #include <errno.h> > #include <dirent.h> > +#include <limits.h> > +#include <time.h> > > #include "sockaddr.h" > #include "misc.h" > @@ -406,17 +408,27 @@ unexportfs(char *arg, int verbose) > > static int can_test(void) > { > + char buf[1024]; > int fd; > int n; > - char *setup = "nfsd 0.0.0.0 2147483647 -test-client-\n"; > + > fd = open("/proc/net/rpc/auth.unix.ip/channel", O_WRONLY); > - if ( fd < 0) return 0; > - n = write(fd, setup, strlen(setup)); > + if (fd < 0) > + return 0; > + > + if (time(NULL) > INT_MAX) > + sprintf(buf, "nfsd 0.0.0.0 %ld -test-client-\n", LONG_MAX); > + else > + sprintf(buf, "nfsd 0.0.0.0 %d -test-client-\n", INT_MAX); This generally makes sense, but I think the cut-off is a bit too fine. If time(NULL) is exactly INT_MAX, then this might not do what is required. How about if (time(NULL) > INT_MAX - (24*3600)) ?? NeilBrown > + > + n = write(fd, buf, strlen(buf)); > close(fd); > if (n < 0) > return 0; > + > fd = open("/proc/net/rpc/nfsd.export/channel", O_WRONLY); > - if ( fd < 0) return 0; > + if (fd < 0) > + return 0; > close(fd); > return 1; > }
Attachment:
signature.asc
Description: PGP signature