diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-02-07 17:43:02 +0000 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-02-11 08:00:48 -0300 |
commit | 1566d3c43f12a02cca140ae25777c3c196de7795 (patch) | |
tree | bf56c88a5520b33be6a91551731ef182ffbe8966 /sysdeps/unix/sysv/linux/internal_statvfs.c | |
parent | 52f527d6f1e880027e37c422b3ce4f2b12c8ef7d (diff) | |
download | glibc-1566d3c43f12a02cca140ae25777c3c196de7795.tar.gz glibc-1566d3c43f12a02cca140ae25777c3c196de7795.tar.xz glibc-1566d3c43f12a02cca140ae25777c3c196de7795.zip |
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 <carlos@redhat.com>
Diffstat (limited to 'sysdeps/unix/sysv/linux/internal_statvfs.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/internal_statvfs.c | 70 |
1 files changed, 47 insertions, 23 deletions
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 <https://www.gnu.org/licenses/>. */ -#include <assert.h> -#include <errno.h> -#include <mntent.h> -#include <paths.h> -#include <stdbool.h> -#include <stdio_ext.h> -#include <string.h> -#include <sys/mount.h> -#include <sys/stat.h> #include <sys/statfs.h> -#include "internal_statvfs.h" -#include "linux_fsinfo.h" -#include <kernel-features.h> - +#include <sys/statvfs.h> +#include <internal_statvfs.h> +#include <string.h> +#include <time.h> +#include <kernel_stat.h> /* Special internal-only bit value. */ -#define ST_VALID 0x0020 +# 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); +#if !STATFS_IS_STATFS64 +void +__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_STATVFS (const char *name, struct STATVFS *buf, - struct STATFS *fsbuf, int fd) +__internal_statvfs64 (struct statvfs64 *buf, const struct statfs64 *fsbuf) { /* Now fill in the fields we have information for. */ buf->f_bsize = fsbuf->f_bsize; |