Commit 5e7c31df authored by Jan Harkes's avatar Jan Harkes Committed by Linus Torvalds

coda: change Coda's user api to use 64-bit time_t in timespec

Move the 32-bit time_t problems to userspace.

Link: http://lkml.kernel.org/r/8d089068823bfb292a4020f773922fbd82ffad39.1558117389.git.jaharkes@cs.cmu.eduSigned-off-by: default avatarJan 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6ced9aa7
...@@ -481,8 +481,8 @@ kernel support. ...@@ -481,8 +481,8 @@ kernel support.
struct vtimespec { struct coda_timespec {
long tv_sec; /* seconds */ int64_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */ long tv_nsec; /* nanoseconds */
}; };
...@@ -496,9 +496,9 @@ kernel support. ...@@ -496,9 +496,9 @@ kernel support.
long va_fileid; /* file id */ long va_fileid; /* file id */
u_quad_t va_size; /* file size in bytes */ u_quad_t va_size; /* file size in bytes */
long va_blocksize; /* blocksize preferred for i/o */ long va_blocksize; /* blocksize preferred for i/o */
struct vtimespec va_atime; /* time of last access */ struct coda_timespec va_atime; /* time of last access */
struct vtimespec va_mtime; /* time of last modification */ struct coda_timespec va_mtime; /* time of last modification */
struct vtimespec va_ctime; /* time file changed */ struct coda_timespec va_ctime; /* time file changed */
u_long va_gen; /* generation number of file */ u_long va_gen; /* generation number of file */
u_long va_flags; /* flags defined for file */ u_long va_flags; /* flags defined for file */
dev_t va_rdev; /* device special file represents */ dev_t va_rdev; /* device special file represents */
......
...@@ -66,13 +66,8 @@ unsigned short coda_flags_to_cflags(unsigned short flags) ...@@ -66,13 +66,8 @@ unsigned short coda_flags_to_cflags(unsigned short flags)
return coda_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 = { struct timespec64 ts64 = {
.tv_sec = ts.tv_sec, .tv_sec = ts.tv_sec,
.tv_nsec = ts.tv_nsec, .tv_nsec = ts.tv_nsec,
...@@ -81,12 +76,10 @@ static struct timespec64 coda_to_timespec64(struct vtimespec ts) ...@@ -81,12 +76,10 @@ static struct timespec64 coda_to_timespec64(struct vtimespec ts)
return ts64; 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 coda_timespec ts = {
struct vtimespec ts = { .tv_sec = ts64.tv_sec,
.tv_sec = lower_32_bits(clamp_t(time64_t, ts64.tv_sec,
LONG_MIN, LONG_MAX)),
.tv_nsec = ts64.tv_nsec, .tv_nsec = ts64.tv_nsec,
}; };
...@@ -156,11 +149,11 @@ void coda_iattr_to_vattr(struct iattr *iattr, struct coda_vattr *vattr) ...@@ -156,11 +149,11 @@ void coda_iattr_to_vattr(struct iattr *iattr, struct coda_vattr *vattr)
vattr->va_uid = (vuid_t) -1; vattr->va_uid = (vuid_t) -1;
vattr->va_gid = (vgid_t) -1; vattr->va_gid = (vgid_t) -1;
vattr->va_size = (off_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_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_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_ctime.tv_nsec = (long) -1;
vattr->va_type = C_VNON; vattr->va_type = C_VNON;
vattr->va_fileid = -1; vattr->va_fileid = -1;
......
...@@ -86,10 +86,6 @@ typedef unsigned long long u_quad_t; ...@@ -86,10 +86,6 @@ typedef unsigned long long u_quad_t;
#define inline #define inline
struct timespec {
long ts_sec;
long ts_nsec;
};
#else /* DJGPP but not KERNEL */ #else /* DJGPP but not KERNEL */
#include <sys/time.h> #include <sys/time.h>
typedef unsigned long long u_quad_t; typedef unsigned long long u_quad_t;
...@@ -110,13 +106,6 @@ typedef unsigned long long u_quad_t; ...@@ -110,13 +106,6 @@ typedef unsigned long long u_quad_t;
#define cdev_t dev_t #define cdev_t dev_t
#endif #endif
#ifdef __CYGWIN32__
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
#endif
#ifndef __BIT_TYPES_DEFINED__ #ifndef __BIT_TYPES_DEFINED__
#define __BIT_TYPES_DEFINED__ #define __BIT_TYPES_DEFINED__
typedef signed char int8_t; typedef signed char int8_t;
...@@ -211,19 +200,10 @@ struct CodaFid { ...@@ -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 }; enum coda_vtype { C_VNON, C_VREG, C_VDIR, C_VBLK, C_VCHR, C_VLNK, C_VSOCK, C_VFIFO, C_VBAD };
#ifdef __linux__ struct coda_timespec {
/* int64_t tv_sec; /* seconds */
* 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 */
long tv_nsec; /* nanoseconds */ long tv_nsec; /* nanoseconds */
}; };
#else
#define vtimespec timespec
#endif
struct coda_vattr { struct coda_vattr {
long va_type; /* vnode type (for create) */ long va_type; /* vnode type (for create) */
...@@ -234,9 +214,9 @@ struct coda_vattr { ...@@ -234,9 +214,9 @@ struct coda_vattr {
long va_fileid; /* file id */ long va_fileid; /* file id */
u_quad_t va_size; /* file size in bytes */ u_quad_t va_size; /* file size in bytes */
long va_blocksize; /* blocksize preferred for i/o */ long va_blocksize; /* blocksize preferred for i/o */
struct vtimespec va_atime; /* time of last access */ struct coda_timespec va_atime; /* time of last access */
struct vtimespec va_mtime; /* time of last modification */ struct coda_timespec va_mtime; /* time of last modification */
struct vtimespec va_ctime; /* time file changed */ struct coda_timespec va_ctime; /* time file changed */
u_long va_gen; /* generation number of file */ u_long va_gen; /* generation number of file */
u_long va_flags; /* flags defined for file */ u_long va_flags; /* flags defined for file */
cdev_t va_rdev; /* device special file represents */ cdev_t va_rdev; /* device special file represents */
...@@ -301,7 +281,8 @@ struct coda_statfs { ...@@ -301,7 +281,8 @@ struct coda_statfs {
#define CIOC_KERNEL_VERSION _IOWR('c', 10, size_t) #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 * Venus <-> Coda RPC arguments
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment