Message ID | 20190916221700.22039-1-alistair.francis@wdc.com |
---|---|
State | New |
Headers | show |
Series | [1/2] sysdeps/stat: Handle 64-bit ino_t types on 32-bit hosts | expand |
On Sep 16 2019, Alistair Francis <alistair.francis@wdc.com> wrote: > @@ -40,7 +40,10 @@ > /* Versions of the `xmknod' interface. */ > #define _MKNOD_VER_LINUX 0 > > -#if defined __USE_FILE_OFFSET64 > +#if defined(__USE_FILE_OFFSET64) || __INO_T_MATCHES_INO64_T == 1 > +# if __INO_T_MATCHES_INO64_T == 1 && __OFF_T_MATCHES_OFF64_T != 1 Why are you using ==/!= 1 instead of !=/== 0? > +# error "ino_t and off_t must both be the same type" > +# endif > # define __field64(type, type64, name) type64 name > #elif __WORDSIZE == 64 > # define __field64(type, type64, name) type name > diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h > index 45efcd8fd34..3c21da501b2 100644 > --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h > +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h > @@ -36,12 +36,16 @@ static inline off_t lseek_overflow (loff_t res) > > static inline int stat_overflow (struct stat *buf) > { > +#if defined (__INO_T_MATCHES_INO64_T) Shouldn't that be #if __INO_T_MATCHES_INO64_T? Andreas.
On Tue, Sep 17, 2019 at 12:58 AM Andreas Schwab <schwab@suse.de> wrote: > > On Sep 16 2019, Alistair Francis <alistair.francis@wdc.com> wrote: > > > @@ -40,7 +40,10 @@ > > /* Versions of the `xmknod' interface. */ > > #define _MKNOD_VER_LINUX 0 > > > > -#if defined __USE_FILE_OFFSET64 > > +#if defined(__USE_FILE_OFFSET64) || __INO_T_MATCHES_INO64_T == 1 > > +# if __INO_T_MATCHES_INO64_T == 1 && __OFF_T_MATCHES_OFF64_T != 1 > > Why are you using ==/!= 1 instead of !=/== 0? No reason really, it results in the same outcome and I just did it this way. > > > +# error "ino_t and off_t must both be the same type" > > +# endif > > # define __field64(type, type64, name) type64 name > > #elif __WORDSIZE == 64 > > # define __field64(type, type64, name) type name > > diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h > > index 45efcd8fd34..3c21da501b2 100644 > > --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h > > +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h > > @@ -36,12 +36,16 @@ static inline off_t lseek_overflow (loff_t res) > > > > static inline int stat_overflow (struct stat *buf) > > { > > +#if defined (__INO_T_MATCHES_INO64_T) > > Shouldn't that be #if __INO_T_MATCHES_INO64_T? Yes, I'll fix that. Alistair > > Andreas. > > -- > Andreas Schwab, SUSE Labs, schwab@suse.de > GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 > "And now for something completely different."
diff --git a/sysdeps/unix/sysv/linux/generic/bits/stat.h b/sysdeps/unix/sysv/linux/generic/bits/stat.h index 62aeea5a88d..acd8e7c79a6 100644 --- a/sysdeps/unix/sysv/linux/generic/bits/stat.h +++ b/sysdeps/unix/sysv/linux/generic/bits/stat.h @@ -40,7 +40,10 @@ /* Versions of the `xmknod' interface. */ #define _MKNOD_VER_LINUX 0 -#if defined __USE_FILE_OFFSET64 +#if defined(__USE_FILE_OFFSET64) || __INO_T_MATCHES_INO64_T == 1 +# if __INO_T_MATCHES_INO64_T == 1 && __OFF_T_MATCHES_OFF64_T != 1 +# error "ino_t and off_t must both be the same type" +# endif # define __field64(type, type64, name) type64 name #elif __WORDSIZE == 64 # define __field64(type, type64, name) type name diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h index 45efcd8fd34..3c21da501b2 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/overflow.h @@ -36,12 +36,16 @@ static inline off_t lseek_overflow (loff_t res) static inline int stat_overflow (struct stat *buf) { +#if defined (__INO_T_MATCHES_INO64_T) + return 0; +#else if (buf->__st_ino_pad == 0 && buf->__st_size_pad == 0 && buf->__st_blocks_pad == 0) return 0; __set_errno (EOVERFLOW); return -1; +#endif } /* Note that f_files and f_ffree may validly be a sign-extended -1. */