y2038: utimes: Rework #ifdef guards for compat syscalls
authorArnd Bergmann <arnd@arndb.de>
Tue, 17 Apr 2018 10:03:19 +0000 (12:03 +0200)
committerArnd Bergmann <arnd@arndb.de>
Wed, 29 Aug 2018 13:42:23 +0000 (15:42 +0200)
After changing over to 64-bit time_t syscalls, many architectures will
want compat_sys_utimensat() but not respective handlers for utime(),
utimes() and futimesat(). This adds a new __ARCH_WANT_SYS_UTIME32 to
complement __ARCH_WANT_SYS_UTIME. For now, all 64-bit architectures that
support CONFIG_COMPAT set it, but future 64-bit architectures will not
(tile would not have needed it either, but got removed).

As older 32-bit architectures get converted to using CONFIG_64BIT_TIME,
they will have to use __ARCH_WANT_SYS_UTIME32 instead of
__ARCH_WANT_SYS_UTIME. Architectures using the generic syscall ABI don't
need either of them as they never had a utime syscall.

Since the compat_utimbuf structure is now required outside of
CONFIG_COMPAT, I'm moving it into compat_time.h.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
---
changed from last version:
- renamed __ARCH_WANT_COMPAT_SYS_UTIME to __ARCH_WANT_SYS_UTIME32

arch/arm64/include/asm/unistd.h
arch/mips/include/asm/unistd.h
arch/parisc/include/asm/unistd.h
arch/powerpc/include/asm/unistd.h
arch/s390/include/asm/unistd.h
arch/sparc/include/asm/unistd.h
arch/x86/include/asm/unistd.h
fs/utimes.c
include/linux/compat.h
include/linux/time32.h

index 2af308f13463b22000e6af8aa9f8020f2d3747e1..b13ca091f83329fe4eb3fb5cba348ce4c57f1cf7 100644 (file)
@@ -22,6 +22,7 @@
 #define __ARCH_WANT_SYS_SIGPENDING
 #define __ARCH_WANT_SYS_SIGPROCMASK
 #define __ARCH_WANT_COMPAT_SYS_SENDFILE
+#define __ARCH_WANT_SYS_UTIME32
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
 
index c2174b80e50ed2cc2675a8e376a5f9b3c5e67794..c68b8ae3efcb1a2d40876488f797a4b94f25043c 100644 (file)
@@ -31,6 +31,7 @@
 #define __ARCH_WANT_SYS_IPC
 #define __ARCH_WANT_SYS_PAUSE
 #define __ARCH_WANT_SYS_UTIME
+#define __ARCH_WANT_SYS_UTIME32
 #define __ARCH_WANT_SYS_WAITPID
 #define __ARCH_WANT_SYS_SOCKETCALL
 #define __ARCH_WANT_SYS_GETPGRP
index a0c38374fff02dfc85dc6eed3c3336e117cbc717..bc37a4953eaa70185e3c8c64b2a15103331a0c18 100644 (file)
@@ -152,6 +152,7 @@ type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, type5 arg5)       \
 #define __ARCH_WANT_COMPAT_SYS_TIME
 #define __ARCH_WANT_COMPAT_SYS_SCHED_RR_GET_INTERVAL
 #define __ARCH_WANT_SYS_UTIME
+#define __ARCH_WANT_SYS_UTIME32
 #define __ARCH_WANT_SYS_WAITPID
 #define __ARCH_WANT_SYS_SOCKETCALL
 #define __ARCH_WANT_SYS_FADVISE64
index 9326c9133516f63dc037036eec2734ac235280c3..b0de85b477e1527051cb354980c5123670c8e212 100644 (file)
@@ -47,6 +47,7 @@
 #endif
 #ifdef CONFIG_PPC64
 #define __ARCH_WANT_COMPAT_SYS_TIME
+#define __ARCH_WANT_SYS_UTIME32
 #define __ARCH_WANT_SYS_NEWFSTATAT
 #define __ARCH_WANT_COMPAT_SYS_SENDFILE
 #endif
index a2d583ea526d2f8753f54e75861f1f3e0fda5161..a1fbf15d53aa8973082de0738063005a82c7529f 100644 (file)
@@ -34,6 +34,7 @@
 #define __ARCH_WANT_SYS_SIGPROCMASK
 # ifdef CONFIG_COMPAT
 #   define __ARCH_WANT_COMPAT_SYS_TIME
+#   define __ARCH_WANT_SYS_UTIME32
 # endif
 #define __ARCH_WANT_SYS_FORK
 #define __ARCH_WANT_SYS_VFORK
index f7514d3eae7b7fa8946fd6aec308d96175130070..00f87dbd0b17aadef0d3e4a6931290c85ff45dcc 100644 (file)
@@ -42,6 +42,7 @@
 #define __ARCH_WANT_SYS_IPC
 #else
 #define __ARCH_WANT_COMPAT_SYS_TIME
+#define __ARCH_WANT_SYS_UTIME32
 #define __ARCH_WANT_COMPAT_SYS_SENDFILE
 #endif
 
index 153d2a5e6b0279f62ba1468c06a9f6c243a29bed..dc4ed8bc2382c125920821787fedf734a68c0e7a 100644 (file)
@@ -24,6 +24,7 @@
 #  include <asm/unistd_64.h>
 #  include <asm/unistd_64_x32.h>
 #  define __ARCH_WANT_COMPAT_SYS_TIME
+#  define __ARCH_WANT_SYS_UTIME32
 #  define __ARCH_WANT_COMPAT_SYS_PREADV64
 #  define __ARCH_WANT_COMPAT_SYS_PWRITEV64
 #  define __ARCH_WANT_COMPAT_SYS_PREADV64V2
index 2f6f08061a2692fcb7ea6021b6a276ba02f85ef2..bdcf2daf39c11ca7b7e03a73d131dffa5222cf5c 100644 (file)
@@ -218,13 +218,14 @@ SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
 }
 #endif
 
-#ifdef CONFIG_COMPAT
+#ifdef CONFIG_COMPAT_32BIT_TIME
 /*
  * Not all architectures have sys_utime, so implement this in terms
  * of sys_utimes.
  */
+#ifdef __ARCH_WANT_SYS_UTIME32
 COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
-                      struct compat_utimbuf __user *, t)
+                      struct old_utimbuf32 __user *, t)
 {
        struct timespec64 tv[2];
 
@@ -237,6 +238,7 @@ COMPAT_SYSCALL_DEFINE2(utime, const char __user *, filename,
        }
        return do_utimes(AT_FDCWD, filename, t ? tv : NULL, 0);
 }
+#endif
 
 COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filename, struct old_timespec32 __user *, t, int, flags)
 {
@@ -253,6 +255,7 @@ COMPAT_SYSCALL_DEFINE4(utimensat, unsigned int, dfd, const char __user *, filena
        return do_utimes(dfd, filename, t ? tv : NULL, flags);
 }
 
+#ifdef __ARCH_WANT_SYS_UTIME32
 static long do_compat_futimesat(unsigned int dfd, const char __user *filename,
                                struct old_timeval32 __user *t)
 {
@@ -285,3 +288,4 @@ COMPAT_SYSCALL_DEFINE2(utimes, const char __user *, filename, struct old_timeval
        return do_compat_futimesat(AT_FDCWD, filename, t);
 }
 #endif
+#endif
index d376fa8be00d025d11bfcb97c3a3b1a579471b77..6fb5abdb87be6a982ced49cb927e13d327e7732b 100644 (file)
@@ -113,11 +113,6 @@ typedef __compat_gid32_t   compat_gid_t;
 struct compat_sel_arg_struct;
 struct rusage;
 
-struct compat_utimbuf {
-       old_time32_t            actime;
-       old_time32_t            modtime;
-};
-
 struct compat_itimerval {
        struct old_timeval32    it_interval;
        struct old_timeval32    it_value;
@@ -942,7 +937,7 @@ asmlinkage long compat_sys_newlstat(const char __user *filename,
 /* __ARCH_WANT_SYSCALL_DEPRECATED */
 asmlinkage long compat_sys_time(old_time32_t __user *tloc);
 asmlinkage long compat_sys_utime(const char __user *filename,
-                                struct compat_utimbuf __user *t);
+                                struct old_utimbuf32 __user *t);
 asmlinkage long compat_sys_futimesat(unsigned int dfd,
                                     const char __user *filename,
                                     struct old_timeval32 __user *t);
index 0e0d7304d1a8358493e2a15d9ad821dc758abd6d..61904a6c098f2305bcb512241b68fe2ed7b6b271 100644 (file)
@@ -30,6 +30,11 @@ struct old_itimerspec32 {
        struct old_timespec32 it_value;
 };
 
+struct old_utimbuf32 {
+       old_time32_t    actime;
+       old_time32_t    modtime;
+};
+
 extern int get_old_timespec32(struct timespec64 *, const void __user *);
 extern int put_old_timespec32(const struct timespec64 *, void __user *);
 extern int get_old_itimerspec32(struct itimerspec64 *its,