Message ID | 20210208214936.1502047-9-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | stat[fs,vfs] consolidation | expand |
On 2/8/21 4:49 PM, Adhemerval Zanella via Libc-alpha wrote: > 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, removed unused includes on internal_statvfs.c, and remove > unused arguments on __internal_statvfs{64}. Cleans up the interfaces. LGTM. Reviewed-by: Carlos O'Donell <carlos@redhat.com> > --- > 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 | 70 +++++++++++++------ > 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, 56 insertions(+), 37 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 <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; > } >
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; }