From 6bbfc5c09fc5b5e3d4a0cddbbd4e2e457767dae7 Mon Sep 17 00:00:00 2001 From: Mao Han Date: Mon, 26 Nov 2018 11:13:32 +0800 Subject: Add statx conditionals for wordsize-32 *xstat.c Linux kernel have remove stat64 family from default syscall set, new implementations with statx is needed when __ARCH_WANT_STAT64 is not define. This patch add conditionals for relevant functions, using statx system call to get information and then copy to the return buf, ref to include/linux/fs.h from linux kernel. * sysdeps/unix/sysv/linux/Makefile: Add statx_cp.c. * sysdeps/unix/sysv/linux/fxstat64.c: Add conditionals for kernel without stat64 system call support. * sysdeps/unix/sysv/linux/fxstatat64.c: Likewise. * sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c: Likewise. * sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c: Likewise. * sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c: Likewise. * sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c: Likewise. * sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c: Likewise. * sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/statx_cp.c: New file. * sysdeps/unix/sysv/linux/statx_cp.c: Likewise. * sysdeps/unix/sysv/linux/statx_cp.h: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/statx_cp.c: Likewise. --- sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c | 10 ++++++++++ .../unix/sysv/linux/generic/wordsize-32/fxstatat.c | 10 ++++++++++ sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c | 10 ++++++++++ .../unix/sysv/linux/generic/wordsize-32/lxstat64.c | 19 +++++++++++++++++-- sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c | 9 +++++++++ sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c | 16 ++++++++++++++-- 6 files changed, 70 insertions(+), 4 deletions(-) (limited to 'sysdeps/unix/sysv/linux/generic') diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c index b5c766d..9e9df5d 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstat.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -27,6 +28,7 @@ #if !XSTAT_IS_XSTAT64 #include "overflow.h" +#include /* Get information about the file FD in BUF. */ int @@ -34,7 +36,15 @@ __fxstat (int vers, int fd, struct stat *buf) { if (vers == _STAT_VER_KERNEL) { +# ifdef __NR_fstat64 int rc = INLINE_SYSCALL (fstat64, 2, fd, buf); +# else + struct statx tmp; + int rc = INLINE_SYSCALL (statx, 5, fd, "", AT_EMPTY_PATH, + STATX_BASIC_STATS, &tmp); + if (rc == 0) + __cp_stat64_statx ((struct stat64 *)buf, &tmp); +# endif return rc ?: stat_overflow (buf); } diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c index 0bda8f7..62e9ce3 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/fxstatat.c @@ -28,6 +28,7 @@ #if !XSTAT_IS_XSTAT64 #include "overflow.h" +#include /* Get information about the file NAME in BUF. */ int @@ -35,7 +36,16 @@ __fxstatat (int vers, int fd, const char *file, struct stat *buf, int flag) { if (vers == _STAT_VER_KERNEL) { +# ifdef __NR_fstatat64 int rc = INLINE_SYSCALL (fstatat64, 4, fd, file, buf, flag); +# else + struct statx tmp; + int rc = INLINE_SYSCALL (statx, 5, fd, file, + AT_NO_AUTOMOUNT | flag, + STATX_BASIC_STATS, &tmp); + if (rc == 0) + __cp_stat64_statx ((struct stat64 *)buf, &tmp); +# endif return rc ?: stat_overflow (buf); } diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c index c278a4d..e16c441 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat.c @@ -27,6 +27,7 @@ #if !XSTAT_IS_XSTAT64 #include "overflow.h" +#include /* Get information about the file NAME in BUF. */ int @@ -34,8 +35,17 @@ __lxstat (int vers, const char *name, struct stat *buf) { if (vers == _STAT_VER_KERNEL) { +#ifdef __NR_fstatat64 int rc = INLINE_SYSCALL (fstatat64, 4, AT_FDCWD, name, buf, AT_SYMLINK_NOFOLLOW); +#else + struct statx tmp; + int rc = INLINE_SYSCALL (statx, 5, AT_FDCWD, name, + AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW, + STATX_BASIC_STATS, &tmp); + if (rc == 0) + __cp_stat64_statx ((struct stat64 *)buf, &tmp); +#endif return rc ?: stat_overflow (buf); } errno = EINVAL; diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c index 761dd16..86b7a98 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/lxstat64.c @@ -32,13 +32,28 @@ #include #include +#include + /* Get information about the file NAME in BUF. */ int __lxstat64 (int vers, const char *name, struct stat64 *buf) { if (vers == _STAT_VER_KERNEL) - return INLINE_SYSCALL (fstatat64, 4, AT_FDCWD, name, buf, - AT_SYMLINK_NOFOLLOW); + { +#ifdef __NR_fstatat64 + return INLINE_SYSCALL (fstatat64, 4, AT_FDCWD, name, buf, + AT_SYMLINK_NOFOLLOW); +#else + struct statx tmp; + int rc = INLINE_SYSCALL (statx, 5, AT_FDCWD, name, + AT_NO_AUTOMOUNT | AT_SYMLINK_NOFOLLOW, + STATX_BASIC_STATS, &tmp); + if (rc == 0) + __cp_stat64_statx (buf, &tmp); + return rc; +#endif + } + errno = EINVAL; return -1; } diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c index 1fd57ff..bd3f3a4 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat.c @@ -27,6 +27,7 @@ #if !XSTAT_IS_XSTAT64 #include "overflow.h" +#include /* Get information about the file NAME in BUF. */ int @@ -34,7 +35,15 @@ __xstat (int vers, const char *name, struct stat *buf) { if (vers == _STAT_VER_KERNEL) { +# ifdef __NR_fstatat64 int rc = INLINE_SYSCALL (fstatat64, 4, AT_FDCWD, name, buf, 0); +# else + struct statx tmp; + int rc = INLINE_SYSCALL (statx, 5, AT_FDCWD, name, AT_NO_AUTOMOUNT, + STATX_BASIC_STATS, &tmp); + if (rc == 0) + __cp_stat64_statx ((struct stat64 *)buf, &tmp); +# endif return rc ?: stat_overflow (buf); } diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c index ae70495..7b45ab0 100644 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c +++ b/sysdeps/unix/sysv/linux/generic/wordsize-32/xstat64.c @@ -32,13 +32,25 @@ #include #include +#include + /* Get information about the file NAME in BUF. */ int __xstat64 (int vers, const char *name, struct stat64 *buf) { if (vers == _STAT_VER_KERNEL) - return INLINE_SYSCALL (fstatat64, 4, AT_FDCWD, name, buf, 0); - + { +#ifdef __NR_fstatat64 + return INLINE_SYSCALL (fstatat64, 4, AT_FDCWD, name, buf, 0); +#else + struct statx tmp; + int rc = INLINE_SYSCALL (statx, 5, AT_FDCWD, name, AT_NO_AUTOMOUNT, + STATX_BASIC_STATS, &tmp); + if (rc == 0) + __cp_stat64_statx (buf, &tmp); + return rc; +#endif + } errno = EINVAL; return -1; } -- cgit v1.1