1diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
2index 54da635..c5dc1cd 100644
3--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
4+++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
5@@ -1158,8 +1158,9 @@ CHECK_SIZE_AND_OFFSET(ipc_perm, uid);
6 CHECK_SIZE_AND_OFFSET(ipc_perm, gid);
7 CHECK_SIZE_AND_OFFSET(ipc_perm, cuid);
8 CHECK_SIZE_AND_OFFSET(ipc_perm, cgid);
9-#if !defined(__aarch64__) || !SANITIZER_LINUX || __GLIBC_PREREQ (2, 21)
10-/* On aarch64 glibc 2.20 and earlier provided incorrect mode field. */
11+#if !SANITIZER_LINUX || __GLIBC_PREREQ (2, 31)
12+/* glibc 2.30 and earlier provided 16-bit mode field instead of 32-bit
13+ on many architectures. */
14 CHECK_SIZE_AND_OFFSET(ipc_perm, mode);
15 #endif
16
17diff --git a/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/lib/sanitizer_common/sanitizer_platform_limits_posix.h
18index f89a113..f6f986f 100644
19--- a/lib/sanitizer_common/sanitizer_platform_limits_posix.h
20+++ b/lib/sanitizer_common/sanitizer_platform_limits_posix.h
21@@ -213,26 +213,13 @@ namespace __sanitizer {
22 u64 __unused1;
23 u64 __unused2;
24 #elif defined(__sparc__)
25-#if defined(__arch64__)
26 unsigned mode;
27- unsigned short __pad1;
28-#else
29- unsigned short __pad1;
30- unsigned short mode;
31 unsigned short __pad2;
32-#endif
33 unsigned short __seq;
34 unsigned long long __unused1;
35 unsigned long long __unused2;
36-#elif defined(__mips__) || defined(__aarch64__) || defined(__s390x__)
37- unsigned int mode;
38- unsigned short __seq;
39- unsigned short __pad1;
40- unsigned long __unused1;
41- unsigned long __unused2;
42 #else
43- unsigned short mode;
44- unsigned short __pad1;
45+ unsigned int mode;
46 unsigned short __seq;
47 unsigned short __pad2;
48 #if defined(__x86_64__) && !defined(_LP64)