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>
This commit is contained in:
Adhemerval Zanella 2021-02-07 17:43:02 +00:00
parent 52f527d6f1
commit 1566d3c43f
9 changed files with 59 additions and 40 deletions

View File

@ -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 \

View File

@ -1 +0,0 @@
#include <sysdeps/unix/sysv/linux/internal_statvfs64.c>

View File

@ -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;

View File

@ -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;
}

View File

@ -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
#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;

View File

@ -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;

View File

@ -1,4 +0,0 @@
#define STATFS statfs64
#define STATVFS statvfs64
#define INTERNAL_STATVFS __internal_statvfs64
#include "internal_statvfs.c"

View File

@ -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;

View File

@ -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;
}