Message ID | 20210208214936.1502047-4-adhemerval.zanella@linaro.org |
---|---|
State | Committed |
Commit | e7702cb56ec99521124befba3c52903842a885c1 |
Delegated to: | Carlos O'Donell |
Headers | show |
Series | stat[fs,vfs] consolidation | expand |
On 2/8/21 4:49 PM, Adhemerval Zanella via Libc-alpha wrote: > Currently glibc has three different struct statfs{64} definitions: > > 1. Non-LFS support where non-LFS and LFS struct have different > size: alpha, arm, hppa, i686, m68k, microblaze, mips (all abis), > powerpc32, s390, sh4, and sparc. Correct, generally 32-bit targets. > > 2. Non-LFS support where non-LFS and LFS struct have the same > size: csky and nios2. Usually newer ports. > > 3. Only LFS support (where both struct have the same size): arc, > ia64, powerpc64 (including LE), riscv (both 32 and 64 bits), > s390x, sparc64, and x86 (including x32). Usually 64-bit ports or very new 32-bit ports aligned with LFS. > The STATFS_IS_STATFS64/__STATFS_MATCHES_STATFS64 does not tell apart > between 1. and 2.; since for both the only difference is the struct > size (for 2. both non-LFS and LFS uses the same syscall, where for > 1. the old non-LFS is used for {f}statfs). > > This patch move the generic statfs.h for both csky and nios2, and > make the default definitions for newer ABIs to assume that only > LFS will be support (so there is no need to keep no-LFS and LFS > struct statfs with the same size, it will be implicit). Good cleanup. Reviewed-by: Carlos O'Donell <carlos@redhat.com> > > This patch does not change the code generation. > --- > .../linux/{generic => csky}/bits/statfs.h | 11 --- > sysdeps/unix/sysv/linux/nios2/bits/statfs.h | 75 +++++++++++++++++++ > 2 files changed, 75 insertions(+), 11 deletions(-) > rename sysdeps/unix/sysv/linux/{generic => csky}/bits/statfs.h (79%) > create mode 100644 sysdeps/unix/sysv/linux/nios2/bits/statfs.h > > diff --git a/sysdeps/unix/sysv/linux/generic/bits/statfs.h b/sysdeps/unix/sysv/linux/csky/bits/statfs.h > similarity index 79% > rename from sysdeps/unix/sysv/linux/generic/bits/statfs.h > rename to sysdeps/unix/sysv/linux/csky/bits/statfs.h > index bef18a3696..131b6adfba 100644 > --- a/sysdeps/unix/sysv/linux/generic/bits/statfs.h > +++ b/sysdeps/unix/sysv/linux/csky/bits/statfs.h > @@ -1,6 +1,5 @@ > /* Copyright (C) 2011-2021 Free Software Foundation, Inc. > This file is part of the GNU C Library. > - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. > > The GNU C Library is free software; you can redistribute it and/or > modify it under the terms of the GNU Lesser General Public > @@ -24,18 +23,8 @@ > #include <bits/types.h> > #include <bits/wordsize.h> > > -/* 64-bit libc uses the kernel's 'struct statfs', accessed via the > - statfs() syscall; 32-bit libc uses the kernel's 'struct statfs64' > - and accesses it via the statfs64() syscall. All the various > - APIs offered by libc use the kernel shape for their struct statfs > - structure; the only difference is that 32-bit programs not > - 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 > # define __field64(type, type64, name) type64 name > -#elif __WORDSIZE == 64 || __STATFS_MATCHES_STATFS64 > -# define __field64(type, type64, name) type name > #elif __BYTE_ORDER == __LITTLE_ENDIAN > # define __field64(type, type64, name) \ > type name __attribute__((__aligned__ (__alignof__ (type64)))); int __##name##_pad > diff --git a/sysdeps/unix/sysv/linux/nios2/bits/statfs.h b/sysdeps/unix/sysv/linux/nios2/bits/statfs.h > new file mode 100644 > index 0000000000..131b6adfba > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/nios2/bits/statfs.h > @@ -0,0 +1,75 @@ > +/* Copyright (C) 2011-2021 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library. If not, see > + <https://www.gnu.org/licenses/>. */ > + > +#ifndef _SYS_STATFS_H > +# error "Never include <bits/statfs.h> directly; use <sys/statfs.h> instead." > +#endif > + > +#include <bits/endian.h> > +#include <bits/types.h> > +#include <bits/wordsize.h> > + > +#if defined __USE_FILE_OFFSET64 > +# define __field64(type, type64, name) type64 name > +#elif __BYTE_ORDER == __LITTLE_ENDIAN > +# define __field64(type, type64, name) \ > + type name __attribute__((__aligned__ (__alignof__ (type64)))); int __##name##_pad > +#else > +# define __field64(type, type64, name) \ > + int __##name##_pad __attribute__((__aligned__ (__alignof__ (type64)))); type name > +#endif > + > +struct statfs > + { > + __SWORD_TYPE f_type; > + __SWORD_TYPE f_bsize; > + __field64(__fsblkcnt_t, __fsblkcnt64_t, f_blocks); > + __field64(__fsblkcnt_t, __fsblkcnt64_t, f_bfree); > + __field64(__fsblkcnt_t, __fsblkcnt64_t, f_bavail); > + __field64(__fsfilcnt_t, __fsfilcnt64_t, f_files); > + __field64(__fsfilcnt_t, __fsfilcnt64_t, f_ffree); > + __fsid_t f_fsid; > + __SWORD_TYPE f_namelen; > + __SWORD_TYPE f_frsize; > + __SWORD_TYPE f_flags; > + __SWORD_TYPE f_spare[4]; > + }; > + > +#undef __field64 > + > +#ifdef __USE_LARGEFILE64 > +struct statfs64 > + { > + __SWORD_TYPE f_type; > + __SWORD_TYPE f_bsize; > + __fsblkcnt64_t f_blocks; > + __fsblkcnt64_t f_bfree; > + __fsblkcnt64_t f_bavail; > + __fsfilcnt64_t f_files; > + __fsfilcnt64_t f_ffree; > + __fsid_t f_fsid; > + __SWORD_TYPE f_namelen; > + __SWORD_TYPE f_frsize; > + __SWORD_TYPE f_flags; > + __SWORD_TYPE f_spare[4]; > + }; > +#endif > + > +/* Tell code we have these members. */ > +#define _STATFS_F_NAMELEN > +#define _STATFS_F_FRSIZE > +#define _STATFS_F_FLAGS >
diff --git a/sysdeps/unix/sysv/linux/generic/bits/statfs.h b/sysdeps/unix/sysv/linux/csky/bits/statfs.h similarity index 79% rename from sysdeps/unix/sysv/linux/generic/bits/statfs.h rename to sysdeps/unix/sysv/linux/csky/bits/statfs.h index bef18a3696..131b6adfba 100644 --- a/sysdeps/unix/sysv/linux/generic/bits/statfs.h +++ b/sysdeps/unix/sysv/linux/csky/bits/statfs.h @@ -1,6 +1,5 @@ /* Copyright (C) 2011-2021 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -24,18 +23,8 @@ #include <bits/types.h> #include <bits/wordsize.h> -/* 64-bit libc uses the kernel's 'struct statfs', accessed via the - statfs() syscall; 32-bit libc uses the kernel's 'struct statfs64' - and accesses it via the statfs64() syscall. All the various - APIs offered by libc use the kernel shape for their struct statfs - structure; the only difference is that 32-bit programs not - 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 # define __field64(type, type64, name) type64 name -#elif __WORDSIZE == 64 || __STATFS_MATCHES_STATFS64 -# define __field64(type, type64, name) type name #elif __BYTE_ORDER == __LITTLE_ENDIAN # define __field64(type, type64, name) \ type name __attribute__((__aligned__ (__alignof__ (type64)))); int __##name##_pad diff --git a/sysdeps/unix/sysv/linux/nios2/bits/statfs.h b/sysdeps/unix/sysv/linux/nios2/bits/statfs.h new file mode 100644 index 0000000000..131b6adfba --- /dev/null +++ b/sysdeps/unix/sysv/linux/nios2/bits/statfs.h @@ -0,0 +1,75 @@ +/* Copyright (C) 2011-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library. If not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _SYS_STATFS_H +# error "Never include <bits/statfs.h> directly; use <sys/statfs.h> instead." +#endif + +#include <bits/endian.h> +#include <bits/types.h> +#include <bits/wordsize.h> + +#if defined __USE_FILE_OFFSET64 +# define __field64(type, type64, name) type64 name +#elif __BYTE_ORDER == __LITTLE_ENDIAN +# define __field64(type, type64, name) \ + type name __attribute__((__aligned__ (__alignof__ (type64)))); int __##name##_pad +#else +# define __field64(type, type64, name) \ + int __##name##_pad __attribute__((__aligned__ (__alignof__ (type64)))); type name +#endif + +struct statfs + { + __SWORD_TYPE f_type; + __SWORD_TYPE f_bsize; + __field64(__fsblkcnt_t, __fsblkcnt64_t, f_blocks); + __field64(__fsblkcnt_t, __fsblkcnt64_t, f_bfree); + __field64(__fsblkcnt_t, __fsblkcnt64_t, f_bavail); + __field64(__fsfilcnt_t, __fsfilcnt64_t, f_files); + __field64(__fsfilcnt_t, __fsfilcnt64_t, f_ffree); + __fsid_t f_fsid; + __SWORD_TYPE f_namelen; + __SWORD_TYPE f_frsize; + __SWORD_TYPE f_flags; + __SWORD_TYPE f_spare[4]; + }; + +#undef __field64 + +#ifdef __USE_LARGEFILE64 +struct statfs64 + { + __SWORD_TYPE f_type; + __SWORD_TYPE f_bsize; + __fsblkcnt64_t f_blocks; + __fsblkcnt64_t f_bfree; + __fsblkcnt64_t f_bavail; + __fsfilcnt64_t f_files; + __fsfilcnt64_t f_ffree; + __fsid_t f_fsid; + __SWORD_TYPE f_namelen; + __SWORD_TYPE f_frsize; + __SWORD_TYPE f_flags; + __SWORD_TYPE f_spare[4]; + }; +#endif + +/* Tell code we have these members. */ +#define _STATFS_F_NAMELEN +#define _STATFS_F_FRSIZE +#define _STATFS_F_FLAGS