coda: change Coda's user api to use 64-bit time_t in timespec
authorJan Harkes <jaharkes@cs.cmu.edu>
Tue, 16 Jul 2019 23:28:35 +0000 (16:28 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 17 Jul 2019 02:23:23 +0000 (19:23 -0700)
Move the 32-bit time_t problems to userspace.

Link: http://lkml.kernel.org/r/8d089068823bfb292a4020f773922fbd82ffad39.1558117389.git.jaharkes@cs.cmu.edu
Signed-off-by: Jan Harkes <jaharkes@cs.cmu.edu>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Colin Ian King <colin.king@canonical.com>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
Cc: David Howells <dhowells@redhat.com>
Cc: Fabian Frederick <fabf@skynet.be>
Cc: Mikko Rapeli <mikko.rapeli@iki.fi>
Cc: Sam Protsenko <semen.protsenko@linaro.org>
Cc: Yann Droneaud <ydroneaud@opteya.com>
Cc: Zhouyang Jia <jiazhouyang09@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Documentation/filesystems/coda.txt
fs/coda/coda_linux.c
include/uapi/linux/coda.h

index ea5969068895aa8ed97ad305f7d21c4de474c7e4..545262c167c33f2e1c9f28e4bf86be28c12f2264 100644 (file)
@@ -481,8 +481,8 @@ kernel support.
 
 
 
-  struct vtimespec {
-          long            tv_sec;         /* seconds */
+  struct coda_timespec {
+          int64_t         tv_sec;         /* seconds */
           long            tv_nsec;        /* nanoseconds */
   };
 
@@ -496,9 +496,9 @@ kernel support.
           long            va_fileid;      /* file id */
           u_quad_t        va_size;        /* file size in bytes */
           long            va_blocksize;   /* blocksize preferred for i/o */
-          struct vtimespec va_atime;      /* time of last access */
-          struct vtimespec va_mtime;      /* time of last modification */
-          struct vtimespec va_ctime;      /* time file changed */
+          struct coda_timespec va_atime;  /* time of last access */
+          struct coda_timespec va_mtime;  /* time of last modification */
+          struct coda_timespec va_ctime;  /* time file changed */
           u_long          va_gen;         /* generation number of file */
           u_long          va_flags;       /* flags defined for file */
           dev_t           va_rdev;        /* device special file represents */
index 8addcd166908c87b4f75c8ffcd3806f5bd4676bc..e4b5f02f0dd41dbaf54b507678ef39a61550d718 100644 (file)
@@ -66,13 +66,8 @@ unsigned short coda_flags_to_cflags(unsigned short flags)
        return coda_flags;
 }
 
-static struct timespec64 coda_to_timespec64(struct vtimespec ts)
+static struct timespec64 coda_to_timespec64(struct coda_timespec ts)
 {
-       /*
-        * We interpret incoming timestamps as 'signed' to match traditional
-        * usage and support pre-1970 timestamps, but this breaks in y2038
-        * on 32-bit machines.
-        */
        struct timespec64 ts64 = {
                .tv_sec = ts.tv_sec,
                .tv_nsec = ts.tv_nsec,
@@ -81,12 +76,10 @@ static struct timespec64 coda_to_timespec64(struct vtimespec ts)
        return ts64;
 }
 
-static struct vtimespec timespec64_to_coda(struct timespec64 ts64)
+static struct coda_timespec timespec64_to_coda(struct timespec64 ts64)
 {
-       /* clamp the timestamps to the maximum range rather than wrapping */
-       struct vtimespec ts = {
-               .tv_sec = lower_32_bits(clamp_t(time64_t, ts64.tv_sec,
-                                               LONG_MIN, LONG_MAX)),
+       struct coda_timespec ts = {
+               .tv_sec = ts64.tv_sec,
                .tv_nsec = ts64.tv_nsec,
        };
 
@@ -156,11 +149,11 @@ void coda_iattr_to_vattr(struct iattr *iattr, struct coda_vattr *vattr)
         vattr->va_uid = (vuid_t) -1; 
         vattr->va_gid = (vgid_t) -1;
         vattr->va_size = (off_t) -1;
-       vattr->va_atime.tv_sec = (long) -1;
+       vattr->va_atime.tv_sec = (int64_t) -1;
        vattr->va_atime.tv_nsec = (long) -1;
-       vattr->va_mtime.tv_sec = (long) -1;
+       vattr->va_mtime.tv_sec = (int64_t) -1;
        vattr->va_mtime.tv_nsec = (long) -1;
-       vattr->va_ctime.tv_sec = (long) -1;
+       vattr->va_ctime.tv_sec = (int64_t) -1;
        vattr->va_ctime.tv_nsec = (long) -1;
         vattr->va_type = C_VNON;
        vattr->va_fileid = -1;
index fc5f7874208a911193d820a96443a04b197aa3eb..5dba636b6e11ea9c784fead5455f214e973e64ef 100644 (file)
@@ -86,10 +86,6 @@ typedef unsigned long long u_quad_t;
 
 #define inline
 
-struct timespec {
-        long       ts_sec;
-        long       ts_nsec;
-};
 #else  /* DJGPP but not KERNEL */
 #include <sys/time.h>
 typedef unsigned long long u_quad_t;
@@ -110,13 +106,6 @@ typedef unsigned long long u_quad_t;
 #define cdev_t dev_t
 #endif
 
-#ifdef __CYGWIN32__
-struct timespec {
-        time_t  tv_sec;         /* seconds */
-        long    tv_nsec;        /* nanoseconds */
-};
-#endif
-
 #ifndef __BIT_TYPES_DEFINED__
 #define __BIT_TYPES_DEFINED__
 typedef signed char          int8_t;
@@ -211,19 +200,10 @@ struct CodaFid {
  */
 enum coda_vtype        { C_VNON, C_VREG, C_VDIR, C_VBLK, C_VCHR, C_VLNK, C_VSOCK, C_VFIFO, C_VBAD };
 
-#ifdef __linux__
-/*
- * This matches the traditional Linux 'timespec' structure binary layout,
- * before using 64-bit time_t everywhere. Overflows in y2038 on 32-bit
- * architectures.
- */
-struct vtimespec {
-       long            tv_sec;         /* seconds */
+struct coda_timespec {
+       int64_t         tv_sec;         /* seconds */
        long            tv_nsec;        /* nanoseconds */
 };
-#else
-#define vtimespec timespec
-#endif
 
 struct coda_vattr {
        long            va_type;        /* vnode type (for create) */
@@ -234,9 +214,9 @@ struct coda_vattr {
        long            va_fileid;      /* file id */
        u_quad_t        va_size;        /* file size in bytes */
        long            va_blocksize;   /* blocksize preferred for i/o */
-       struct vtimespec va_atime;      /* time of last access */
-       struct vtimespec va_mtime;      /* time of last modification */
-       struct vtimespec va_ctime;      /* time file changed */
+       struct coda_timespec va_atime;  /* time of last access */
+       struct coda_timespec va_mtime;  /* time of last modification */
+       struct coda_timespec va_ctime;  /* time file changed */
        u_long          va_gen;         /* generation number of file */
        u_long          va_flags;       /* flags defined for file */
        cdev_t          va_rdev;        /* device special file represents */
@@ -301,7 +281,8 @@ struct coda_statfs {
 
 #define CIOC_KERNEL_VERSION _IOWR('c', 10, size_t)
 
-#define CODA_KERNEL_VERSION 3 /* 128-bit file identifiers */
+//      CODA_KERNEL_VERSION 3 /* 128-bit file identifiers */
+#define CODA_KERNEL_VERSION 4 /* 64-bit timespec */
 
 /*
  *        Venus <-> Coda  RPC arguments