[v6,2/2] Define __STATFS_MATCHES_STATFS64
Commit Message
Add a new macro __STATFS_MATCHES_STATFS64 that specifies if fsblkcnt_t
matches fsblkcnt64_t and if fsfilcnt_t matches fsfilcnt64_t.
On a 32-bit platform with a 64-bit ino_t type (__STATFS_MATCHES_STATFS64
== 1) we want to update the statfs struct to remove the padding as it
isn't required. As we don't have the padding we also need to update the
overflow checker to not access the undefined members.
---
This change was tested by running user space tests for RV32 and RV64.
This patch doesn't use the new macro. The RV32 port uses the macro, this
is a preperation patch.
v5:
- Add missing changed to :
- sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
- sysdeps/mach/hurd/bits/typesizes.h
v4:
- Convert to 0/1 convention instead of defined/not
- Move "|| defined __STATFS_MATCHES_STATFS64" in the __WORDSIZE == 64
v2:
- Change to if defined instead of if == 1
- Introduce __STATFS_MATCHES_STATFS64
bits/typesizes.h | 5 +++++
sysdeps/mach/hurd/bits/typesizes.h | 6 ++++++
sysdeps/unix/sysv/linux/alpha/bits/typesizes.h | 3 +++
sysdeps/unix/sysv/linux/generic/bits/statfs.h | 2 +-
sysdeps/unix/sysv/linux/generic/bits/typesizes.h | 6 +++++-
sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h | 4 ++++
sysdeps/unix/sysv/linux/s390/bits/typesizes.h | 5 +++++
sysdeps/unix/sysv/linux/sparc/bits/typesizes.h | 5 +++++
sysdeps/unix/sysv/linux/x86/bits/typesizes.h | 5 +++++
9 files changed, 39 insertions(+), 2 deletions(-)
Comments
On Tue, 22 Oct 2019, Alistair Francis wrote:
> On a 32-bit platform with a 64-bit ino_t type (__STATFS_MATCHES_STATFS64
> == 1)
The commit message should not talk about ino_t; the types in this
structure are nothing to do with ino_t, even if in fact it happens that
they do match.
> diff --git a/sysdeps/mach/hurd/bits/typesizes.h b/sysdeps/mach/hurd/bits/typesizes.h
> index c30de12d1d4..e4c975ebd07 100644
> --- a/sysdeps/mach/hurd/bits/typesizes.h
> +++ b/sysdeps/mach/hurd/bits/typesizes.h
> @@ -64,5 +64,11 @@
> /* Number of descriptors that can fit in an `fd_set'. */
> #define __FD_SETSIZE 256
>
> +/* Tell the libc code that fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and
> + fsfilcnt64_t are actually the same type for all ABI purposes, even
> + if possibly expressed as different base types for C type-checking
> + purposes. */
> +# define __STATFS_MATCHES_STATFS64 1
I don't believe that's accurate. __FSBLKCNT_T_TYPE is __ULONGWORD_TYPE
but __FSBLKCNT64_T_TYPE is __UQUAD_TYPE, for example (and the only
existing Hurd port is 32-bit, so the types never match for Hurd at
present, so an unconditional 0 would be OK for the definition there right
now).
> diff --git a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
> index 20231152e33..5eb96f9a1e7 100644
> --- a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
> +++ b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
> @@ -69,6 +69,9 @@
> /* And for __rlim_t and __rlim64_t. */
> #define __RLIM_T_MATCHES_RLIM64_T 1
>
> +/* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */
> +# define __STATFS_MATCHES_STATFS64 1
This is also inaccurate; alpha, despite being a 64-bit architecture, uses
a 32-bit statfs by default.
On Tue, Oct 22, 2019 at 3:33 PM Joseph Myers <joseph@codesourcery.com> wrote:
>
> On Tue, 22 Oct 2019, Alistair Francis wrote:
>
> > On a 32-bit platform with a 64-bit ino_t type (__STATFS_MATCHES_STATFS64
> > == 1)
>
> The commit message should not talk about ino_t; the types in this
> structure are nothing to do with ino_t, even if in fact it happens that
> they do match.
I have dropped that explanation.
>
> > diff --git a/sysdeps/mach/hurd/bits/typesizes.h b/sysdeps/mach/hurd/bits/typesizes.h
> > index c30de12d1d4..e4c975ebd07 100644
> > --- a/sysdeps/mach/hurd/bits/typesizes.h
> > +++ b/sysdeps/mach/hurd/bits/typesizes.h
> > @@ -64,5 +64,11 @@
> > /* Number of descriptors that can fit in an `fd_set'. */
> > #define __FD_SETSIZE 256
> >
> > +/* Tell the libc code that fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and
> > + fsfilcnt64_t are actually the same type for all ABI purposes, even
> > + if possibly expressed as different base types for C type-checking
> > + purposes. */
> > +# define __STATFS_MATCHES_STATFS64 1
>
> I don't believe that's accurate. __FSBLKCNT_T_TYPE is __ULONGWORD_TYPE
> but __FSBLKCNT64_T_TYPE is __UQUAD_TYPE, for example (and the only
> existing Hurd port is 32-bit, so the types never match for Hurd at
> present, so an unconditional 0 would be OK for the definition there right
> now).
Ok, removed.
>
> > diff --git a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
> > index 20231152e33..5eb96f9a1e7 100644
> > --- a/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
> > +++ b/sysdeps/unix/sysv/linux/alpha/bits/typesizes.h
> > @@ -69,6 +69,9 @@
> > /* And for __rlim_t and __rlim64_t. */
> > #define __RLIM_T_MATCHES_RLIM64_T 1
> >
> > +/* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */
> > +# define __STATFS_MATCHES_STATFS64 1
>
> This is also inaccurate; alpha, despite being a 64-bit architecture, uses
> a 32-bit statfs by default.
Ok, removed.
Alistair
>
> --
> Joseph S. Myers
> joseph@codesourcery.com
@@ -72,8 +72,13 @@
/* And for rlim_t and rlim64_t. */
# define __RLIM_T_MATCHES_RLIM64_T 1
+
+/* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */
+# define __STATFS_MATCHES_STATFS64 1
#else
# define __RLIM_T_MATCHES_RLIM64_T 0
+
+# define __STATFS_MATCHES_STATFS64 0
#endif
/* Number of descriptors that can fit in an `fd_set'. */
@@ -64,5 +64,11 @@
/* Number of descriptors that can fit in an `fd_set'. */
#define __FD_SETSIZE 256
+/* Tell the libc code that fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and
+ fsfilcnt64_t are actually the same type for all ABI purposes, even
+ if possibly expressed as different base types for C type-checking
+ purposes. */
+# define __STATFS_MATCHES_STATFS64 1
+
#endif /* bits/typesizes.h */
@@ -69,6 +69,9 @@
/* And for __rlim_t and __rlim64_t. */
#define __RLIM_T_MATCHES_RLIM64_T 1
+/* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */
+# define __STATFS_MATCHES_STATFS64 1
+
/* Number of descriptors that can fit in an `fd_set'. */
#define __FD_SETSIZE 1024
@@ -34,7 +34,7 @@
#if defined __USE_FILE_OFFSET64
# define __field64(type, type64, name) type64 name
-#elif __WORDSIZE == 64
+#elif __WORDSIZE == 64 || __STATFS_MATCHES_STATFS64
# define __field64(type, type64, name) type name
#elif __BYTE_ORDER == __LITTLE_ENDIAN
# define __field64(type, type64, name) \
@@ -73,10 +73,14 @@
/* And for __rlim_t and __rlim64_t. */
# define __RLIM_T_MATCHES_RLIM64_T 1
+
+/* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */
+# define __STATFS_MATCHES_STATFS64 1
#else
# define __RLIM_T_MATCHES_RLIM64_T 0
-#endif
+# define __STATFS_MATCHES_STATFS64 0
+#endif
/* Number of descriptors that can fit in an `fd_set'. */
#define __FD_SETSIZE 1024
@@ -51,6 +51,9 @@ static inline int stat_overflow (struct stat *buf)
/* Note that f_files and f_ffree may validly be a sign-extended -1. */
static inline int statfs_overflow (struct statfs *buf)
{
+#if __STATFS_MATCHES_STATFS64
+ return 0;
+#else
if (buf->__f_blocks_pad == 0 && buf->__f_bfree_pad == 0
&& buf->__f_bavail_pad == 0
&& (buf->__f_files_pad == 0
@@ -61,4 +64,5 @@ static inline int statfs_overflow (struct statfs *buf)
__set_errno (EOVERFLOW);
return -1;
+#endif
}
@@ -78,8 +78,13 @@
/* And for __rlim_t and __rlim64_t. */
# define __RLIM_T_MATCHES_RLIM64_T 1
+
+/* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */
+# define __STATFS_MATCHES_STATFS64 1
#else
# define __RLIM_T_MATCHES_RLIM64_T 0
+
+# define __STATFS_MATCHES_STATFS64 0
#endif
/* Number of descriptors that can fit in an `fd_set'. */
@@ -72,8 +72,13 @@
/* And for __rlim_t and __rlim64_t. */
# define __RLIM_T_MATCHES_RLIM64_T 1
+
+/* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */
+# define __STATFS_MATCHES_STATFS64 1
#else
# define __RLIM_T_MATCHES_RLIM64_T 0
+
+# define __STATFS_MATCHES_STATFS64 0
#endif
/* Number of descriptors that can fit in an `fd_set'. */
@@ -84,8 +84,13 @@
/* And for __rlim_t and __rlim64_t. */
# define __RLIM_T_MATCHES_RLIM64_T 1
+
+/* And for fsblkcnt_t, fsblkcnt64_t, fsfilcnt_t and fsfilcnt64_t. */
+# define __STATFS_MATCHES_STATFS64 1
#else
# define __RLIM_T_MATCHES_RLIM64_T 0
+
+# define __STATFS_MATCHES_STATFS64 0
#endif
/* Number of descriptors that can fit in an `fd_set'. */