diff options
-rw-r--r-- | sysdeps/unix/sysv/linux/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/alpha/internal_statvfs64.c | 1 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/fstatvfs.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/fstatvfs64.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/internal_statvfs.c | 70 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/internal_statvfs.h | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/internal_statvfs64.c | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/statvfs.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/statvfs64.c | 2 |
9 files changed, 56 insertions, 37 deletions
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 <sysdeps/unix/sysv/linux/internal_statvfs64.c> 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 <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; 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 <sys/statvfs.h> -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; } |