[v3,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
defined) 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.
* sysdeps/unix/sysv/linux/generic/bits/statfs.h: Define
__STATFS_MATCHES_STATFS64 to handle 64-bit __fsblkcnt_t
and t__fsfilcnt_t types on 32-bit hosts.
* sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h: Likewise.
---
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.
v2:
- Change to if defined instead of if == 1
- Introduce __STATFS_MATCHES_STATFS64
sysdeps/unix/sysv/linux/generic/bits/statfs.h | 2 +-
sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h | 4 ++++
2 files changed, 5 insertions(+), 1 deletion(-)
Comments
On Thu, 3 Oct 2019, Alistair Francis wrote:
> Add a new macro __STATFS_MATCHES_STATFS64 that specifies if fsblkcnt_t
> matches fsblkcnt64_t and if fsfilcnt_t matches fsfilcnt64_t.
As a new macro it would be better to use the 0/1 convention (always
defined, at least for linux/generic configurations that need it) rather
than undefined / defined. A default definition can go in bits/typesizes.h
with a comment.
> -#if defined __USE_FILE_OFFSET64
> +#if defined __USE_FILE_OFFSET64 || defined __STATFS_MATCHES_STATFS64
> # define __field64(type, type64, name) type64 name
> #elif __WORDSIZE == 64
As in the stat case, I think it would be best to put the "|| defined
__STATFS_MATCHES_STATFS64" in the __WORDSIZE == 64 case not the
__USE_FILE_OFFSET64 case.
On Thu, Oct 3, 2019 at 1:03 PM Joseph Myers <joseph@codesourcery.com> wrote:
>
> On Thu, 3 Oct 2019, Alistair Francis wrote:
>
> > Add a new macro __STATFS_MATCHES_STATFS64 that specifies if fsblkcnt_t
> > matches fsblkcnt64_t and if fsfilcnt_t matches fsfilcnt64_t.
>
> As a new macro it would be better to use the 0/1 convention (always
> defined, at least for linux/generic configurations that need it) rather
> than undefined / defined. A default definition can go in bits/typesizes.h
> with a comment.
Ok, I have updated the patch.
>
> > -#if defined __USE_FILE_OFFSET64
> > +#if defined __USE_FILE_OFFSET64 || defined __STATFS_MATCHES_STATFS64
> > # define __field64(type, type64, name) type64 name
> > #elif __WORDSIZE == 64
>
> As in the stat case, I think it would be best to put the "|| defined
> __STATFS_MATCHES_STATFS64" in the __WORDSIZE == 64 case not the
> __USE_FILE_OFFSET64 case.
Done, I'll send a v4 once my tests pass.
Alistair
>
> --
> Joseph S. Myers
> joseph@codesourcery.com
@@ -32,7 +32,7 @@
using __USE_FILE_OFFSET64 only see the low 32 bits of some
of the fields (the __fsblkcnt_t and __fsfilcnt_t fields). */
-#if defined __USE_FILE_OFFSET64
+#if defined __USE_FILE_OFFSET64 || defined __STATFS_MATCHES_STATFS64
# define __field64(type, type64, name) type64 name
#elif __WORDSIZE == 64
# define __field64(type, type64, name) type name
@@ -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 defined __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
}