From 1566d3c43f12a02cca140ae25777c3c196de7795 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Sun, 7 Feb 2021 17:43:02 +0000 Subject: [PATCH] linux: Consolidate internal_statvfs Remove the internal_statvfs64.c and open code the implementation on internal_statvfs.c. The alpha is now unrequired, the generic implementation also handles it. Also, remove unused includes on internal_statvfs.c, and remove unused arguments on __internal_statvfs{64}. Reviewed-by: Carlos O'Donell --- sysdeps/unix/sysv/linux/Makefile | 2 +- .../sysv/linux/alpha/internal_statvfs64.c | 1 - sysdeps/unix/sysv/linux/fstatvfs.c | 2 +- sysdeps/unix/sysv/linux/fstatvfs64.c | 2 +- sysdeps/unix/sysv/linux/internal_statvfs.c | 76 ++++++++++++------- sysdeps/unix/sysv/linux/internal_statvfs.h | 8 +- sysdeps/unix/sysv/linux/internal_statvfs64.c | 4 - sysdeps/unix/sysv/linux/statvfs.c | 2 +- sysdeps/unix/sysv/linux/statvfs64.c | 2 +- 9 files changed, 59 insertions(+), 40 deletions(-) delete mode 100644 sysdeps/unix/sysv/linux/alpha/internal_statvfs64.c delete mode 100644 sysdeps/unix/sysv/linux/internal_statvfs64.c diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index a0a6dcef17..488114a41e 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -273,7 +273,7 @@ CFLAGS-ypclnt.c = -DUSE_BINDINGDIR=1 endif ifeq ($(subdir),io) -sysdep_routines += xstatconv internal_statvfs internal_statvfs64 \ +sysdep_routines += xstatconv internal_statvfs \ sync_file_range fallocate fallocate64 \ close_nocancel fcntl_nocancel \ open_nocancel open64_nocancel \ diff --git a/sysdeps/unix/sysv/linux/alpha/internal_statvfs64.c b/sysdeps/unix/sysv/linux/alpha/internal_statvfs64.c deleted file mode 100644 index 81d18f7bb2..0000000000 --- a/sysdeps/unix/sysv/linux/alpha/internal_statvfs64.c +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/sysdeps/unix/sysv/linux/fstatvfs.c b/sysdeps/unix/sysv/linux/fstatvfs.c index 0f56a13ca9..ba3fd22cfb 100644 --- a/sysdeps/unix/sysv/linux/fstatvfs.c +++ b/sysdeps/unix/sysv/linux/fstatvfs.c @@ -33,7 +33,7 @@ __fstatvfs (int fd, struct statvfs *buf) return -1; /* Convert the result. */ - __internal_statvfs (NULL, buf, &fsbuf, fd); + __internal_statvfs (buf, &fsbuf); /* We signal success if the statfs call succeeded. */ return 0; diff --git a/sysdeps/unix/sysv/linux/fstatvfs64.c b/sysdeps/unix/sysv/linux/fstatvfs64.c index b95745e8b8..ba869f594c 100644 --- a/sysdeps/unix/sysv/linux/fstatvfs64.c +++ b/sysdeps/unix/sysv/linux/fstatvfs64.c @@ -33,7 +33,7 @@ __fstatvfs64 (int fd, struct statvfs64 *buf) return -1; /* Convert the result. */ - __internal_statvfs64 (NULL, buf, &fsbuf, fd); + __internal_statvfs64 (buf, &fsbuf); return 0; } diff --git a/sysdeps/unix/sysv/linux/internal_statvfs.c b/sysdeps/unix/sysv/linux/internal_statvfs.c index 4d9064141c..39fcb5d429 100644 --- a/sysdeps/unix/sysv/linux/internal_statvfs.c +++ b/sysdeps/unix/sysv/linux/internal_statvfs.c @@ -16,37 +16,61 @@ License along with the GNU C Library; if not, see . */ -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include "internal_statvfs.h" -#include "linux_fsinfo.h" -#include - +#include +#include +#include +#include +#include /* Special internal-only bit value. */ -#define ST_VALID 0x0020 - - -#ifndef STATFS -# define STATFS statfs -# define STATVFS statvfs -# define INTERNAL_STATVFS __internal_statvfs -#else -extern int __statvfs_getflags (const char *name, int fstype, int fd); -#endif - +# define ST_VALID 0x0020 +#if !STATFS_IS_STATFS64 void -INTERNAL_STATVFS (const char *name, struct STATVFS *buf, - struct STATFS *fsbuf, int fd) +__internal_statvfs (struct statvfs *buf, const struct statfs *fsbuf) +{ + /* Now fill in the fields we have information for. */ + buf->f_bsize = fsbuf->f_bsize; + /* Linux has the f_frsize size only in later version of the kernel. + If the value is not filled in use f_bsize. */ + buf->f_frsize = fsbuf->f_frsize ?: fsbuf->f_bsize; + buf->f_blocks = fsbuf->f_blocks; + buf->f_bfree = fsbuf->f_bfree; + buf->f_bavail = fsbuf->f_bavail; + buf->f_files = fsbuf->f_files; + buf->f_ffree = fsbuf->f_ffree; + if (sizeof (buf->f_fsid) == sizeof (fsbuf->f_fsid)) + /* The shifting uses 'unsigned long long int' even though the target + field might only have 32 bits. This is OK since the 'if' branch + is not used in this case but the compiler would still generate + warnings. */ + buf->f_fsid = ((fsbuf->f_fsid.__val[0] + & ((1ULL << (8 * sizeof (fsbuf->f_fsid.__val[0]))) - 1)) + | ((unsigned long long int) fsbuf->f_fsid.__val[1] + << (8 * (sizeof (buf->f_fsid) + - sizeof (fsbuf->f_fsid.__val[0]))))); + else + /* We cannot help here. The statvfs element is not large enough to + contain both words of the statfs f_fsid field. */ + buf->f_fsid = fsbuf->f_fsid.__val[0]; +#ifdef _STATVFSBUF_F_UNUSED + buf->__f_unused = 0; +#endif + buf->f_namemax = fsbuf->f_namelen; + memset (buf->__f_spare, '\0', sizeof (buf->__f_spare)); + + /* What remains to do is to fill the fields f_favail and f_flag. */ + + /* XXX I have no idea how to compute f_favail. Any idea??? */ + buf->f_favail = buf->f_ffree; + + buf->f_flag = fsbuf->f_flags ^ ST_VALID; +} +#endif + +void +__internal_statvfs64 (struct statvfs64 *buf, const struct statfs64 *fsbuf) { /* Now fill in the fields we have information for. */ buf->f_bsize = fsbuf->f_bsize; diff --git a/sysdeps/unix/sysv/linux/internal_statvfs.h b/sysdeps/unix/sysv/linux/internal_statvfs.h index 9ac675c2e8..a8e9aec2c8 100644 --- a/sysdeps/unix/sysv/linux/internal_statvfs.h +++ b/sysdeps/unix/sysv/linux/internal_statvfs.h @@ -18,9 +18,9 @@ #include -extern void __internal_statvfs (const char *name, struct statvfs *buf, - struct statfs *fsbuf, int fd) +extern void __internal_statvfs (struct statvfs *buf, + const struct statfs *fsbuf) attribute_hidden; -extern void __internal_statvfs64 (const char *name, struct statvfs64 *buf, - struct statfs64 *fsbuf, int fd) +extern void __internal_statvfs64 (struct statvfs64 *buf, + const struct statfs64 *fsbuf) attribute_hidden; diff --git a/sysdeps/unix/sysv/linux/internal_statvfs64.c b/sysdeps/unix/sysv/linux/internal_statvfs64.c deleted file mode 100644 index 49e7689f8b..0000000000 --- a/sysdeps/unix/sysv/linux/internal_statvfs64.c +++ /dev/null @@ -1,4 +0,0 @@ -#define STATFS statfs64 -#define STATVFS statvfs64 -#define INTERNAL_STATVFS __internal_statvfs64 -#include "internal_statvfs.c" diff --git a/sysdeps/unix/sysv/linux/statvfs.c b/sysdeps/unix/sysv/linux/statvfs.c index f165899711..210242b9a0 100644 --- a/sysdeps/unix/sysv/linux/statvfs.c +++ b/sysdeps/unix/sysv/linux/statvfs.c @@ -33,7 +33,7 @@ __statvfs (const char *file, struct statvfs *buf) return -1; /* Convert the result. */ - __internal_statvfs (file, buf, &fsbuf, -1); + __internal_statvfs (buf, &fsbuf); /* We signal success if the statfs call succeeded. */ return 0; diff --git a/sysdeps/unix/sysv/linux/statvfs64.c b/sysdeps/unix/sysv/linux/statvfs64.c index 3d29908afa..3f03b7edb8 100644 --- a/sysdeps/unix/sysv/linux/statvfs64.c +++ b/sysdeps/unix/sysv/linux/statvfs64.c @@ -33,7 +33,7 @@ __statvfs64 (const char *file, struct statvfs64 *buf) return -1; /* Convert the result. */ - __internal_statvfs64 (file, buf, &fsbuf, -1); + __internal_statvfs64 (buf, &fsbuf); return 0; }