[PATCH] linux: Define STAT64_IS_KERNEL_STAT64 by default
Stafford Horne
shorne@gmail.com
Tue Nov 23 21:39:04 GMT 2021
On Mon, Nov 22, 2021 at 10:00:31AM -0300, Adhemerval Zanella wrote:
>
>
> On 20/11/2021 18:09, Stafford Horne via Libc-alpha wrote:
> > In commit 36260d5035 ("linux: Set default kernel_stat.h to LFS") the
> > default for STAT64_IS_KERNEL_STAT64 was removed. This patch adds it
> > back.
> >
> > For architectures that want to used the default kernel_stat.h and do not
> > have __NR_newfstatat, STAT64_IS_KERNEL_STAT64 needs to be defined. Set
> > the default as 1 as modern port's stat64 struct should match the kernel
> > stat64 layout.
> >
> > I tested this on the OpenRISC port and it seems to work fine. Currently,
> > all archs that use the default kernel_stat.h define __NR_newfstatat so
> > they will not use the STAT64_IS_KERNEL_STAT64 macro. However, arc seems
> > to be an outlier it uses the default kernel_stat.h, but does not define
> > __NR_newfstatat or __NR_fstatat64 I am not clear how arc works here.
>
> arc and usually newer 32-bit ports will only use __NR_statx:
>
> 138 #if (__WORDSIZE == 32 \
> 139 && (!defined __SYSCALL_WORDSIZE || __SYSCALL_WORDSIZE == 32)) \
> 140 || defined STAT_HAS_TIME32
> 141 # define FSTATAT_USE_STATX 1
> 142 #else
> 143 # define FSTATAT_USE_STATX 0
> 144 #endif
>
> The patch looks ok, but it seems strange that ork1 requires it since it
> setting minimum required kernel to 5.10. I would expect that __ASSUME_STATX
> would be defined and only fstatat64_time64_statx would be used.
Right,
In that case maybe another ifdef is needed in fstatat64.c? I don't see
fstatat64_time64_stat is actually getting compiled into the libc.so binary. But
if I don't define STAT64_IS_KERNEL_STAT64 I get the below compile error.
I added a pragma to output the value of FSTATAT_USE_STATX and __ASSUME_STATX in
the compile unit and I get the below which looks right:
* __ASSUME_STATX: 1
* FSTATAT_USE_STATX: 1
Error:
or1k-glibc-linux-gnu-gcc ../sysdeps/unix/sysv/linux/fstatat64.c -c -std=gnu11 -fgnu89-inline -g -O2 -Wall -Wwrite-strings -Wundef -Werror -fmerge-all-constants -frounding-math -fno-stack-protector -fno-common -Wstrict-prototypes -Wold-style-definition -fmath-errno -ftls-model=initial-exec -I../include -I/home/shorne/work/gnu-toolchain/build-many/build/glibcs/or1k-linux-gnu-soft/glibc/io -I/home/shorne/work/gnu-toolchain/build-many/build/glibcs/or1k-linux-gnu-soft/glibc -I../sysdeps/unix/sysv/linux/or1k -I../sysdeps/or1k/nptl -I../sysdeps/unix/sysv/linux/generic/wordsize-32 -I../sysdeps/unix/sysv/linux/generic -I../sysdeps/unix/sysv/linux/include -I../sysdeps/unix/sysv/linux -I../sysdeps/nptl -I../sysdeps/pthread -I../sysdeps/gnu -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/or1k/nofpu -I../sysdeps/ieee754/soft-fp -I../sysdeps/or1k -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754 -I../sysdeps/generic -I.. -I../libio -I. -D_LIBC_REENTRANT -include /home/shorne/work/gnu-toolchain/build-many/build/glibcs/or1k-linux-gnu-soft/glibc/libc-modules.h -DMODULE_NAME=libc -include ../include/libc-symbols.h -DTOP_NAMESPACE=glibc -o /home/shorne/work/gnu-toolchain/build-many/build/glibcs/or1k-linux-gnu-soft/glibc/io/fstatat64.o -MD -MP -MF /home/shorne/work/gnu-toolchain/build-many/build/glibcs/or1k-linux-gnu-soft/glibc/io/fstatat64.o.dt -MT /home/shorne/work/gnu-toolchain/build-many/build/glibcs/or1k-linux-gnu-soft/glibc/io/fstatat64.o
../sysdeps/unix/sysv/linux/fstatat64.c: In function ‘fstatat64_time64_stat’:
../sysdeps/unix/sysv/linux/fstatat64.c:89:7: error: "STAT64_IS_KERNEL_STAT64" is not defined, evaluates to 0 [-Werror=undef]
89 | # if STAT64_IS_KERNEL_STAT64
| ^~~~~~~~~~~~~~~~~~~~~~~
../sysdeps/unix/sysv/linux/fstatat64.c:94:24: error: storage size of ‘kst64’ isn’t known
94 | struct kernel_stat64 kst64;
| ^~~~~
../sysdeps/unix/sysv/linux/fstatat64.c:97:5: error: implicit declaration of function ‘__cp_stat64_kstat64’ [-Werror=implicit-function-declaration]
97 | __cp_stat64_kstat64 (buf, &kst64);
| ^~~~~~~~~~~~~~~~~~~
../sysdeps/unix/sysv/linux/fstatat64.c:94:24: error: unused variable ‘kst64’ [-Werror=unused-variable]
94 | struct kernel_stat64 kst64;
| ^~~~~
../sysdeps/unix/sysv/linux/fstatat64.c: At top level:
../sysdeps/unix/sysv/linux/fstatat64.c:149:9: note: ‘#pragma message: The value of FSTATAT_USE_STATX: 1’
149 | #pragma message "The value of FSTATAT_USE_STATX: " XSTR(FSTATAT_USE_STATX)
| ^~~~~~~
../sysdeps/unix/sysv/linux/fstatat64.c:150:9: note: ‘#pragma message: The value of __ASSUME_STATX: 1’
150 | #pragma message "The value of __ASSUME_STATX: " XSTR(__ASSUME_STATX)
| ^~~~~~~
Again I am not sure how arc avoids this error I shall try to compile it too.
-Stafford
> > ---
> > sysdeps/unix/sysv/linux/kernel_stat.h | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/sysdeps/unix/sysv/linux/kernel_stat.h b/sysdeps/unix/sysv/linux/kernel_stat.h
> > index 6c1b175cb4..b8c376f41e 100644
> > --- a/sysdeps/unix/sysv/linux/kernel_stat.h
> > +++ b/sysdeps/unix/sysv/linux/kernel_stat.h
> > @@ -20,3 +20,4 @@
> > #define XSTAT_IS_XSTAT64 1
> > #define STATFS_IS_STATFS64 __STATFS_MATCHES_STATFS64
> > #define STAT_IS_KERNEL_STAT 1
> > +#define STAT64_IS_KERNEL_STAT64 1
> >
>
More information about the Libc-alpha
mailing list