aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/include/uapi/asm/sembuf.h
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2015-05-05 23:05:19 +0200
committerArnd Bergmann <arnd@arndb.de>2018-04-20 16:19:52 +0200
commitc039dbd5f4bbf3547fde7ce9f7403e25938aa253 (patch)
treebbdbbbc908e2d7abd64d415d7ef16c52df8110a1 /arch/x86/include/uapi/asm/sembuf.h
parenty2038: asm-generic: Extend sysvipc data structures (diff)
downloadlinux-dev-c039dbd5f4bbf3547fde7ce9f7403e25938aa253.tar.xz
linux-dev-c039dbd5f4bbf3547fde7ce9f7403e25938aa253.zip
y2038: x86: Extend sysvipc data structures
This extends the x86 copy of the sysvipc data structures to deal with 32-bit user space that has 64-bit time_t and wants to see timestamps beyond 2038. Fortunately, x86 has padding for this purpose in all the data structures, so we can just add extra fields. With msgid64_ds and shmid64_ds, the data structure is identical to the asm-generic version, which we have already extended. For some reason however, the 64-bit version of semid64_ds ended up with extra padding, so I'm implementing the same approach as the asm-generic version here, by using separate fields for the upper and lower halves of the two timestamps. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to '')
-rw-r--r--arch/x86/include/uapi/asm/sembuf.h11
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/x86/include/uapi/asm/sembuf.h b/arch/x86/include/uapi/asm/sembuf.h
index cabd7476bd6c..89de6cd9f0a7 100644
--- a/arch/x86/include/uapi/asm/sembuf.h
+++ b/arch/x86/include/uapi/asm/sembuf.h
@@ -8,15 +8,24 @@
* between kernel and user space.
*
* Pad space is left for:
- * - 64-bit time_t to solve y2038 problem
* - 2 miscellaneous 32-bit values
+ *
+ * x86_64 and x32 incorrectly added padding here, so the structures
+ * are still incompatible with the padding on x86.
*/
struct semid64_ds {
struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
+#ifdef __i386__
+ unsigned long sem_otime; /* last semop time */
+ unsigned long sem_otime_high;
+ unsigned long sem_ctime; /* last change time */
+ unsigned long sem_ctime_high;
+#else
__kernel_time_t sem_otime; /* last semop time */
__kernel_ulong_t __unused1;
__kernel_time_t sem_ctime; /* last change time */
__kernel_ulong_t __unused2;
+#endif
__kernel_ulong_t sem_nsems; /* no. of semaphores in array */
__kernel_ulong_t __unused3;
__kernel_ulong_t __unused4;