[01/18] Use 64 bit time_t stat internally

Message ID 20210617115104.1359598-2-adhemerval.zanella@linaro.org
State New
Headers show
Series
  • More y2038 fixes
Related show

Commit Message

Michael Hudson-Doyle via Libc-alpha June 17, 2021, 11:50 a.m.
For the legacy ABI with supports 32 bit time_t it calls the 64 bit
time directly, since the LFS symbols calls the 64 bit time_t ones
internally.

Checked on i686-linux-gnu and x86_64-linux-gnu.
---
 csu/check_fds.c                     |  8 ++++----
 elf/dl-load.c                       |  8 ++++----
 elf/dl-misc.c                       |  4 ++--
 elf/dl-profile.c                    |  4 ++--
 iconv/gconv_cache.c                 |  4 ++--
 include/dirent.h                    |  2 +-
 include/file_change_detection.h     |  6 +++---
 inet/rcmd.c                         |  6 +++---
 intl/loadmsgcat.c                   |  4 ++--
 io/Makefile                         |  4 ++--
 io/file_change_detection.c          | 16 +++++++++-------
 io/getdirname.c                     |  6 +++---
 libio/filedoalloc.c                 |  2 +-
 libio/fileops.c                     |  8 ++++----
 libio/oldfileops.c                  |  2 +-
 libio/wfileops.c                    |  2 +-
 locale/loadarchive.c                |  8 ++++----
 locale/loadlocale.c                 |  6 +++---
 nscd/nscd_helper.c                  |  4 ++--
 nss/nss_database.c                  |  4 ++--
 sysdeps/posix/dl-fileid.h           |  4 ++--
 sysdeps/posix/euidaccess.c          |  4 ++--
 sysdeps/posix/getaddrinfo.c         | 21 +++++++++++----------
 sysdeps/posix/getcwd.c              | 15 ++++++++-------
 sysdeps/posix/pathconf.c            |  4 ++--
 sysdeps/posix/sysconf.c             |  4 ++--
 sysdeps/posix/tempname.c            |  8 ++++----
 sysdeps/unix/sysv/linux/fdopendir.c |  4 ++--
 sysdeps/unix/sysv/linux/fexecve.c   |  4 ++--
 sysdeps/unix/sysv/linux/opendir.c   |  7 ++++---
 sysdeps/unix/sysv/linux/pathconf.c  |  5 +++--
 sysdeps/unix/sysv/linux/ttyname.h   | 10 ++--------
 sysdeps/unix/sysv/linux/ttyname_r.c | 16 ++++++++--------
 sysvipc/ftok.c                      |  4 ++--
 time/tzfile.c                       |  6 +++---
 35 files changed, 112 insertions(+), 112 deletions(-)

-- 
2.30.2

Comments

Lukasz Majewski June 21, 2021, 7:42 a.m. | #1
On Thu, 17 Jun 2021 08:50:47 -0300
Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote:

> For the legacy ABI with supports 32 bit time_t it calls the 64 bit

> time directly, since the LFS symbols calls the 64 bit time_t ones

> internally.

> 

> Checked on i686-linux-gnu and x86_64-linux-gnu.

> ---

>  csu/check_fds.c                     |  8 ++++----

>  elf/dl-load.c                       |  8 ++++----

>  elf/dl-misc.c                       |  4 ++--

>  elf/dl-profile.c                    |  4 ++--

>  iconv/gconv_cache.c                 |  4 ++--

>  include/dirent.h                    |  2 +-

>  include/file_change_detection.h     |  6 +++---

>  inet/rcmd.c                         |  6 +++---

>  intl/loadmsgcat.c                   |  4 ++--

>  io/Makefile                         |  4 ++--

>  io/file_change_detection.c          | 16 +++++++++-------

>  io/getdirname.c                     |  6 +++---

>  libio/filedoalloc.c                 |  2 +-

>  libio/fileops.c                     |  8 ++++----

>  libio/oldfileops.c                  |  2 +-

>  libio/wfileops.c                    |  2 +-

>  locale/loadarchive.c                |  8 ++++----

>  locale/loadlocale.c                 |  6 +++---

>  nscd/nscd_helper.c                  |  4 ++--

>  nss/nss_database.c                  |  4 ++--

>  sysdeps/posix/dl-fileid.h           |  4 ++--

>  sysdeps/posix/euidaccess.c          |  4 ++--

>  sysdeps/posix/getaddrinfo.c         | 21 +++++++++++----------

>  sysdeps/posix/getcwd.c              | 15 ++++++++-------

>  sysdeps/posix/pathconf.c            |  4 ++--

>  sysdeps/posix/sysconf.c             |  4 ++--

>  sysdeps/posix/tempname.c            |  8 ++++----

>  sysdeps/unix/sysv/linux/fdopendir.c |  4 ++--

>  sysdeps/unix/sysv/linux/fexecve.c   |  4 ++--

>  sysdeps/unix/sysv/linux/opendir.c   |  7 ++++---

>  sysdeps/unix/sysv/linux/pathconf.c  |  5 +++--

>  sysdeps/unix/sysv/linux/ttyname.h   | 10 ++--------

>  sysdeps/unix/sysv/linux/ttyname_r.c | 16 ++++++++--------

>  sysvipc/ftok.c                      |  4 ++--

>  time/tzfile.c                       |  6 +++---

>  35 files changed, 112 insertions(+), 112 deletions(-)

> 

> diff --git a/csu/check_fds.c b/csu/check_fds.c

> index fbab28c284..6dc67334af 100644

> --- a/csu/check_fds.c

> +++ b/csu/check_fds.c

> @@ -69,10 +69,10 @@ check_one_fd (int fd, int mode)

>  	 Note that the following code assumes that STDIN_FILENO,

>  	 STDOUT_FILENO, STDERR_FILENO are the three lowest file

>  	 decsriptor numbers, in this order.  */

> -      struct stat64 st;

> -      if (__builtin_expect (nullfd != fd, 0)

> -	  || __builtin_expect (__fstat64 (fd, &st), 0) != 0

> -	  || __builtin_expect (S_ISCHR (st.st_mode), 1) == 0

> +      struct __stat64_t64 st;

> +      if (__glibc_unlikely (nullfd != fd)

> +	  || __glibc_likely (__fstat64_time64 (fd, &st) != 0)

> +	  || __glibc_unlikely (S_ISCHR (st.st_mode) == 0)

>  	  || st.st_rdev != dev)

>  	/* We cannot even give an error message here since it would

>  	   run into the same problems.  */

> diff --git a/elf/dl-load.c b/elf/dl-load.c

> index 918ec7546c..a08df001af 100644

> --- a/elf/dl-load.c

> +++ b/elf/dl-load.c

> @@ -1946,11 +1946,11 @@ open_path (const char *name, size_t namelen,

> int mode, {

>  		  /* We failed to open machine dependent library.

> Let's test whether there is any directory at all.  */

> -		  struct stat64 st;

> +		  struct __stat64_t64 st;

>  

>  		  buf[buflen - namelen - 1] = '\0';

>  

> -		  if (__stat64 (buf, &st) != 0

> +		  if (__stat64_time64 (buf, &st) != 0

>  		      || ! S_ISDIR (st.st_mode))

>  		    /* The directory does not exist or it is no

> directory.  */ this_dir->status[cnt] = nonexisting;

> @@ -1968,9 +1968,9 @@ open_path (const char *name, size_t namelen,

> int mode, /* This is an extra security effort to make sure nobody can

>  		 preload broken shared objects which are in the

> trusted directories and so exploit the bugs.  */

> -	      struct stat64 st;

> +	      struct __stat64_t64 st;

>  

> -	      if (__fstat64 (fd, &st) != 0

> +	      if (__fstat64_time64 (fd, &st) != 0

>  		  || (st.st_mode & S_ISUID) == 0)

>  		{

>  		  /* The shared object cannot be tested for being

> SUID diff --git a/elf/dl-misc.c b/elf/dl-misc.c

> index d4803bba4e..b256d792c6 100644

> --- a/elf/dl-misc.c

> +++ b/elf/dl-misc.c

> @@ -43,11 +43,11 @@ void *

>  _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int

> prot) {

>    void *result = MAP_FAILED;

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>    int fd = __open64_nocancel (file, O_RDONLY | O_CLOEXEC);

>    if (fd >= 0)

>      {

> -      if (__fstat64 (fd, &st) >= 0)

> +      if (__fstat64_time64 (fd, &st) >= 0)

>  	{

>  	  *sizep = st.st_size;

>  

> diff --git a/elf/dl-profile.c b/elf/dl-profile.c

> index 35b03959bc..088c023d95 100644

> --- a/elf/dl-profile.c

> +++ b/elf/dl-profile.c

> @@ -185,7 +185,7 @@ _dl_start_profile (void)

>  {

>    char *filename;

>    int fd;

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>    const ElfW(Phdr) *ph;

>    ElfW(Addr) mapstart = ~((ElfW(Addr)) 0);

>    ElfW(Addr) mapend = 0;

> @@ -342,7 +342,7 @@ _dl_start_profile (void)

>        return;

>      }

>  

> -  if (__fstat64 (fd, &st) < 0 || !S_ISREG (st.st_mode))

> +  if (__fstat64_time64 (fd, &st) < 0 || !S_ISREG (st.st_mode))

>      {

>        /* Not stat'able or not a regular file => don't use it.  */

>        errstr = "%s: cannot stat file: %s\n";

> diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c

> index 642cc731eb..68d6386d01 100644

> --- a/iconv/gconv_cache.c

> +++ b/iconv/gconv_cache.c

> @@ -48,7 +48,7 @@ int

>  __gconv_load_cache (void)

>  {

>    int fd;

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>    struct gconvcache_header *header;

>  

>    /* We cannot use the cache if the GCONV_PATH environment variable

> is @@ -64,7 +64,7 @@ __gconv_load_cache (void)

>      return -1;

>  

>    /* Get information about the file.  */

> -  if (__builtin_expect (__fstat64 (fd, &st), 0) < 0

> +  if (__glibc_unlikely (__fstat64_time64 (fd, &st) < 0)

>        /* We do not have to start looking at the file if it cannot

> contain at least the cache header.  */

>        || (size_t) st.st_size < sizeof (struct gconvcache_header))

> diff --git a/include/dirent.h b/include/dirent.h

> index f1d7e8359c..d7567f5e86 100644

> --- a/include/dirent.h

> +++ b/include/dirent.h

> @@ -49,7 +49,7 @@ extern int __versionsort64 (const struct dirent64

> **a, const struct dirent64 **b)

>       __attribute_pure__;

>  extern DIR *__alloc_dir (int fd, bool close_fd, int flags,

> -			 const struct stat64 *statp)

> +			 const struct __stat64_t64 *statp)

>       __nonnull (4) attribute_hidden;

>  extern __typeof (rewinddir) __rewinddir;

>  extern __typeof (seekdir) __seekdir;

> diff --git a/include/file_change_detection.h

> b/include/file_change_detection.h index 9de2bd0b79..953de7c7fd 100644

> --- a/include/file_change_detection.h

> +++ b/include/file_change_detection.h

> @@ -33,8 +33,8 @@ struct file_change_detection

>    off64_t size;

>  

>    ino64_t ino;

> -  struct timespec mtime;

> -  struct timespec ctime;

> +  struct __timespec64 mtime;

> +  struct __timespec64 ctime;

>  };

>  

>  /* Returns true if *LEFT and *RIGHT describe the same version of the

> @@ -45,7 +45,7 @@ bool __file_is_unchanged (const struct

> file_change_detection *left, /* Extract file change information to

> *FILE from the stat buffer *ST.  */

>  void __file_change_detection_for_stat (struct file_change_detection

> *file,

> -                                       const struct stat64 *st);

> +                                       const struct __stat64_t64

> *st); 

>  /* Writes file change information for PATH to *FILE.  Returns true on

>     success.  For benign errors, *FILE is cleared, and true is

> diff --git a/inet/rcmd.c b/inet/rcmd.c

> index 0cfdaee15e..0d6b595572 100644

> --- a/inet/rcmd.c

> +++ b/inet/rcmd.c

> @@ -468,14 +468,14 @@ ruserok (const char *rhost, int superuser,

> const char *ruser, static FILE *

>  iruserfopen (const char *file, uid_t okuser)

>  {

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>    char *cp = NULL;

>    FILE *res = NULL;

>  

>    /* If not a regular file, if owned by someone other than user or

>       root, if writeable by anyone but the owner, or if hardlinked

>       anywhere, quit.  */

> -  if (__lstat64 (file, &st))

> +  if (__lstat64_time64 (file, &st))

>      cp = _("lstat failed");

>    else if (!S_ISREG (st.st_mode))

>      cp = _("not regular file");

> @@ -484,7 +484,7 @@ iruserfopen (const char *file, uid_t okuser)

>        res = fopen (file, "rce");

>        if (!res)

>  	cp = _("cannot open");

> -      else if (__fstat64 (fileno (res), &st) < 0)

> +      else if (__fstat64_time64 (fileno (res), &st) < 0)

>  	cp = _("fstat failed");

>        else if (st.st_uid && st.st_uid != okuser)

>  	cp = _("bad owner");

> diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c

> index 4fda9b0219..30588e9996 100644

> --- a/intl/loadmsgcat.c

> +++ b/intl/loadmsgcat.c

> @@ -756,7 +756,7 @@ _nl_load_domain (struct loaded_l10nfile

> *domain_file, int fd = -1;

>    size_t size;

>  #ifdef _LIBC

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>  #else

>    struct stat st;

>  #endif

> @@ -804,7 +804,7 @@ _nl_load_domain (struct loaded_l10nfile

> *domain_file, /* We must know about the size of the file.  */

>    if (

>  #ifdef _LIBC

> -      __builtin_expect (__fstat64 (fd, &st) != 0, 0)

> +      __builtin_expect (__fstat64_time64 (fd, &st) != 0, 0)

>  #else

>        __builtin_expect (fstat (fd, &st) != 0, 0)

>  #endif

> diff --git a/io/Makefile b/io/Makefile

> index ba8bd37355..1a16990205 100644

> --- a/io/Makefile

> +++ b/io/Makefile

> @@ -69,7 +69,7 @@ tests		:= test-utime test-stat

> test-stat2 test-lfs tst-getcwd \ tst-posix_fallocate

> tst-posix_fallocate64 \ tst-fts tst-fts-lfs tst-open-tmpfile \

>  		   tst-copy_file_range tst-getcwd-abspath tst-lockf \

> -		   tst-ftw-lnk tst-file_change_detection tst-lchmod \

> +		   tst-ftw-lnk tst-lchmod \

>  		   tst-ftw-bz26353 tst-stat tst-stat-lfs \

>  		   tst-utime \

>  		   tst-utimes \

> @@ -90,7 +90,7 @@ tests-time64 := \

>    tst-utimes-time64 \

>  

>  # Likewise for statx, but we do not need static linking here.

> -tests-internal += tst-statx

> +tests-internal += tst-statx tst-file_change_detection

>  tests-static += tst-statx

>  

>  ifeq ($(run-built-tests),yes)

> diff --git a/io/file_change_detection.c b/io/file_change_detection.c

> index 9871bc9166..ac5e451513 100644

> --- a/io/file_change_detection.c

> +++ b/io/file_change_detection.c

> @@ -44,7 +44,7 @@ libc_hidden_def (__file_is_unchanged)

>  

>  void

>  __file_change_detection_for_stat (struct file_change_detection *file,

> -                                  const struct stat64 *st)

> +                                  const struct __stat64_t64 *st)

>  {

>    if (S_ISDIR (st->st_mode))

>      /* Treat as empty file.  */

> @@ -56,8 +56,10 @@ __file_change_detection_for_stat (struct

> file_change_detection *file, {

>        file->size = st->st_size;

>        file->ino = st->st_ino;

> -      file->mtime = st->st_mtim;

> -      file->ctime = st->st_ctim;

> +      file->mtime = (struct __timespec64 ) { .tv_sec  =

> st->st_mtim.tv_sec,

> +					     .tv_nsec =

> st->st_mtim.tv_nsec };

> +      file->ctime = (struct __timespec64 ) { .tv_sec  =

> st->st_ctim.tv_sec,

> +					     .tv_nsec =

> st->st_mtim.tv_nsec }; }

>  }

>  libc_hidden_def (__file_change_detection_for_stat)

> @@ -66,8 +68,8 @@ bool

>  __file_change_detection_for_path (struct file_change_detection *file,

>                                    const char *path)

>  {

> -  struct stat64 st;

> -  if (__stat64 (path, &st) != 0)

> +  struct __stat64_t64 st;

> +  if (__stat64_time64 (path, &st) != 0)

>      switch (errno)

>        {

>        case EACCES:

> @@ -104,8 +106,8 @@ __file_change_detection_for_fp (struct

> file_change_detection *file, }

>    else

>      {

> -      struct stat64 st;

> -      if (__fstat64 (__fileno (fp), &st) != 0)

> +      struct __stat64_t64 st;

> +      if (__fstat64_time64 (__fileno (fp), &st) != 0)

>          /* If we already have a file descriptor, all errors are

> fatal.  */ return false;

>        else

> diff --git a/io/getdirname.c b/io/getdirname.c

> index 32b5ab4b6c..f29e910b37 100644

> --- a/io/getdirname.c

> +++ b/io/getdirname.c

> @@ -28,12 +28,12 @@ char *

>  get_current_dir_name (void)

>  {

>    char *pwd;

> -  struct stat64 dotstat, pwdstat;

> +  struct __stat64_t64 dotstat, pwdstat;

>  

>    pwd = getenv ("PWD");

>    if (pwd != NULL

> -      && __stat64 (".", &dotstat) == 0

> -      && __stat64 (pwd, &pwdstat) == 0

> +      && __stat64_time64 (".", &dotstat) == 0

> +      && __stat64_time64 (pwd, &pwdstat) == 0

>        && pwdstat.st_dev == dotstat.st_dev

>        && pwdstat.st_ino == dotstat.st_ino)

>      /* The PWD value is correct.  Use it.  */

> diff --git a/libio/filedoalloc.c b/libio/filedoalloc.c

> index 7afa3cb683..c792eec88f 100644

> --- a/libio/filedoalloc.c

> +++ b/libio/filedoalloc.c

> @@ -78,7 +78,7 @@ _IO_file_doallocate (FILE *fp)

>  {

>    size_t size;

>    char *p;

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>  

>    size = BUFSIZ;

>    if (fp->_fileno >= 0 && __builtin_expect (_IO_SYSSTAT (fp, &st),

> 0) >= 0) diff --git a/libio/fileops.c b/libio/fileops.c

> index a71a567547..e8ee374821 100644

> --- a/libio/fileops.c

> +++ b/libio/fileops.c

> @@ -545,7 +545,7 @@ libc_hidden_ver (_IO_new_file_underflow,

> _IO_file_underflow) static int

>  mmap_remap_check (FILE *fp)

>  {

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>  

>    if (_IO_SYSSTAT (fp, &st) == 0

>        && S_ISREG (st.st_mode) && st.st_size != 0

> @@ -663,7 +663,7 @@ decide_maybe_mmap (FILE *fp)

>       file descriptors are for mmap-able objects and on 32-bit

>       machines we don't want to map files which are too large since

>       this would require too much virtual memory.  */

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>  

>    if (_IO_SYSSTAT (fp, &st) == 0

>        && S_ISREG (st.st_mode) && st.st_size != 0

> @@ -962,7 +962,7 @@ _IO_new_file_seekoff (FILE *fp, off64_t offset,

> int dir, int mode) break;

>      case _IO_seek_end:

>        {

> -	struct stat64 st;

> +	struct __stat64_t64 st;

>  	if (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode))

>  	  {

>  	    offset += st.st_size;

> @@ -1145,7 +1145,7 @@ libc_hidden_def (_IO_file_seek)

>  int

>  _IO_file_stat (FILE *fp, void *st)

>  {

> -  return __fstat64 (fp->_fileno, (struct stat64 *) st);

> +  return __fstat64_time64 (fp->_fileno, (struct __stat64_t64 *) st);

>  }

>  libc_hidden_def (_IO_file_stat)

>  

> diff --git a/libio/oldfileops.c b/libio/oldfileops.c

> index ed235360ad..ed3c98bd6d 100644

> --- a/libio/oldfileops.c

> +++ b/libio/oldfileops.c

> @@ -487,7 +487,7 @@ _IO_old_file_seekoff (FILE *fp, off64_t offset,

> int dir, int mode) break;

>      case _IO_seek_end:

>        {

> -	struct stat64 st;

> +	struct __stat64_t64 st;

>  	if (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode))

>  	  {

>  	    offset += st.st_size;

> diff --git a/libio/wfileops.c b/libio/wfileops.c

> index 5d23566171..37f44780f8 100644

> --- a/libio/wfileops.c

> +++ b/libio/wfileops.c

> @@ -840,7 +840,7 @@ _IO_wfile_seekoff (FILE *fp, off64_t offset, int

> dir, int mode) break;

>      case _IO_seek_end:

>        {

> -	struct stat64 st;

> +	struct __stat64_t64 st;

>  	if (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode))

>  	  {

>  	    offset += st.st_size;

> diff --git a/locale/loadarchive.c b/locale/loadarchive.c

> index 4177fc8972..512769eaec 100644

> --- a/locale/loadarchive.c

> +++ b/locale/loadarchive.c

> @@ -78,7 +78,7 @@ static struct archmapped *archmapped;

>     ARCHMAPPED points to this; if mapping the archive header failed,

>     then headmap.ptr is null.  */

>  static struct archmapped headmap;

> -static struct stat64 archive_stat; /* stat of archive when header

> mapped.  */ +static struct __stat64_t64 archive_stat; /* stat of

> archive when header mapped.  */ 

>  /* Record of locales that we have already loaded from the archive.

> */ struct locale_in_archive

> @@ -207,7 +207,7 @@ _nl_load_locale_from_archive (int category, const

> char **namep) /* Cannot open the archive, for whatever reason.  */

>  	return NULL;

>  

> -      if (__fstat64 (fd, &archive_stat) == -1)

> +      if (__fstat64_time64 (fd, &archive_stat) == -1)

>  	{

>  	  /* stat failed, very strange.  */

>  	close_and_out:

> @@ -396,7 +396,7 @@ _nl_load_locale_from_archive (int category, const

> char **namep) /* Open the file if it hasn't happened yet.  */

>  	  if (fd == -1)

>  	    {

> -	      struct stat64 st;

> +	      struct __stat64_t64 st;

>  	      fd = __open_nocancel (archfname,

>  				    O_RDONLY|O_LARGEFILE|O_CLOEXEC);

>  	      if (fd == -1)

> @@ -405,7 +405,7 @@ _nl_load_locale_from_archive (int category, const

> char **namep) /* Now verify we think this is really the same archive

> file we opened before.  If it has been changed we cannot trust

>  		 the header we read previously.  */

> -	      if (__fstat64 (fd, &st) < 0

> +	      if (__fstat64_time64 (fd, &st) < 0

>  		  || st.st_size != archive_stat.st_size

>  		  || st.st_mtime != archive_stat.st_mtime

>  		  || st.st_dev != archive_stat.st_dev

> diff --git a/locale/loadlocale.c b/locale/loadlocale.c

> index 9c03490883..f4e6cc9fc2 100644

> --- a/locale/loadlocale.c

> +++ b/locale/loadlocale.c

> @@ -167,7 +167,7 @@ _nl_load_locale (struct loaded_l10nfile *file,

> int category) {

>    int fd;

>    void *filedata;

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>    struct __locale_data *newdata;

>    int save_err;

>    int alloc = ld_mapped;

> @@ -180,7 +180,7 @@ _nl_load_locale (struct loaded_l10nfile *file,

> int category) /* Cannot open the file.  */

>      return;

>  

> -  if (__builtin_expect (__fstat64 (fd, &st), 0) < 0)

> +  if (__glibc_unlikely (__fstat64_time64 (fd, &st) < 0))

>      {

>      puntfd:

>        __close_nocancel_nostatus (fd);

> @@ -206,7 +206,7 @@ _nl_load_locale (struct loaded_l10nfile *file,

> int category) if (__builtin_expect (fd, 0) < 0)

>  	return;

>  

> -      if (__builtin_expect (__fstat64 (fd, &st), 0) < 0)

> +      if (__glibc_unlikely (__fstat64_time64 (fd, &st) < 0))

>  	goto puntfd;

>      }

>  

> diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c

> index 462504d828..06ba7476e5 100644

> --- a/nscd/nscd_helper.c

> +++ b/nscd/nscd_helper.c

> @@ -324,8 +324,8 @@ __nscd_get_mapping (request_type type, const char

> *key, 

>    if (__glibc_unlikely (n == keylen))

>      {

> -      struct stat64 st;

> -      if (__builtin_expect (__fstat64 (mapfd, &st) != 0, 0)

> +      struct __stat64_t64 st;

> +      if (__glibc_unlikely (__fstat64_time64 (mapfd, &st) != 0)

>  	  || __builtin_expect (st.st_size < sizeof (struct

> database_pers_head), 0))

>  	goto out_close;

> diff --git a/nss/nss_database.c b/nss/nss_database.c

> index 1e11294406..ab121cb371 100644

> --- a/nss/nss_database.c

> +++ b/nss/nss_database.c

> @@ -394,7 +394,7 @@ nss_database_check_reload_and_get (struct

> nss_database_state *local, nss_action_list *result,

>                                     enum nss_database database_index)

>  {

> -  struct stat64 str;

> +  struct __stat64_t64 str;

>  

>    /* Acquire MO is needed because the thread that sets

> reload_disabled may have loaded the configuration first, so

> synchronize with the @@ -424,7 +424,7 @@

> nss_database_check_reload_and_get (struct nss_database_state *local,

> errors here are very unlikely, but the chance that we're entering a

> container is also very unlikely, so we err on the side of both very

> unlikely things not happening at the same time.  */

> -  if (__stat64 ("/", &str) != 0

> +  if (__stat64_time64 ("/", &str) != 0

>        || (local->root_ino != 0

>  	  && (str.st_ino != local->root_ino

>  	      ||  str.st_dev != local->root_dev)))

> diff --git a/sysdeps/posix/dl-fileid.h b/sysdeps/posix/dl-fileid.h

> index 0bb6794dbe..bf437f3d71 100644

> --- a/sysdeps/posix/dl-fileid.h

> +++ b/sysdeps/posix/dl-fileid.h

> @@ -32,9 +32,9 @@ struct r_file_id

>  static inline bool

>  _dl_get_file_id (int fd, struct r_file_id *id)

>  {

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>  

> -  if (__glibc_unlikely (__fstat64 (fd, &st) < 0))

> +  if (__glibc_unlikely (__fstat64_time64 (fd, &st) < 0))

>      return false;

>  

>    id->dev = st.st_dev;

> diff --git a/sysdeps/posix/euidaccess.c b/sysdeps/posix/euidaccess.c

> index 26ebb432a2..86f3285471 100644

> --- a/sysdeps/posix/euidaccess.c

> +++ b/sysdeps/posix/euidaccess.c

> @@ -119,7 +119,7 @@ int group_member ();

>  int

>  euidaccess (const char *path, int mode)

>  {

> -  struct stat64 stats;

> +  struct __stat64_t64 stats;

>    int granted;

>  

>  #ifdef	_LIBC

> @@ -140,7 +140,7 @@ euidaccess (const char *path, int mode)

>      return access (path, mode);

>  #endif

>  

> -  if (__stat64 (path, &stats))

> +  if (__stat64_time64 (path, &stats))

>      return -1;

>  

>    mode &= (X_OK | W_OK | R_OK);	/* Clear any bogus bits. */

> diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c

> index b7e1aee80f..b2831508c4 100644

> --- a/sysdeps/posix/getaddrinfo.c

> +++ b/sysdeps/posix/getaddrinfo.c

> @@ -1636,16 +1636,17 @@ static int gaiconf_reload_flag_ever_set;

>  /* Last modification time.  */

>  #ifdef _STATBUF_ST_NSEC

>  

> -static struct timespec gaiconf_mtime;

> +static struct __timespec64 gaiconf_mtime;

>  

>  static inline void

> -save_gaiconf_mtime (const struct stat64 *st)

> +save_gaiconf_mtime (const struct __stat64_t64 *st)

>  {

> -  gaiconf_mtime = st->st_mtim;

> +  gaiconf_mtime = (struct __timespec64) { .tv_sec  =

> st->st_mtim.tv_sec,

> +					  .tv_nsec =

> st->st_mtim.tv_nsec }; }

>  

>  static inline bool

> -check_gaiconf_mtime (const struct stat64 *st)

> +check_gaiconf_mtime (const struct __stat64_t64 *st)

>  {

>    return (st->st_mtim.tv_sec == gaiconf_mtime.tv_sec

>            && st->st_mtim.tv_nsec == gaiconf_mtime.tv_nsec);

> @@ -1656,13 +1657,13 @@ check_gaiconf_mtime (const struct stat64 *st)

>  static time_t gaiconf_mtime;

>  

>  static inline void

> -save_gaiconf_mtime (const struct stat64 *st)

> +save_gaiconf_mtime (const struct __stat64_t64 *st)

>  {

>    gaiconf_mtime = st->st_mtime;

>  }

>  

>  static inline bool

> -check_gaiconf_mtime (const struct stat64 *st)

> +check_gaiconf_mtime (const struct __stat64_t64 *st)

>  {

>    return st->st_mtime == gaiconf_mtime;

>  }

> @@ -1777,8 +1778,8 @@ gaiconf_init (void)

>    FILE *fp = fopen (GAICONF_FNAME, "rce");

>    if (fp != NULL)

>      {

> -      struct stat64 st;

> -      if (__fstat64 (fileno (fp), &st) != 0)

> +      struct __stat64_t64 st;

> +      if (__fstat64_time64 (fileno (fp), &st) != 0)

>  	{

>  	  fclose (fp);

>  	  goto no_file;

> @@ -2130,8 +2131,8 @@ gaiconf_init (void)

>  static void

>  gaiconf_reload (void)

>  {

> -  struct stat64 st;

> -  if (__stat64 (GAICONF_FNAME, &st) != 0

> +  struct __stat64_t64 st;

> +  if (__stat64_time64 (GAICONF_FNAME, &st) != 0

>        || !check_gaiconf_mtime (&st))

>      gaiconf_init ();

>  }

> diff --git a/sysdeps/posix/getcwd.c b/sysdeps/posix/getcwd.c

> index f11644aae7..13680026ff 100644

> --- a/sysdeps/posix/getcwd.c

> +++ b/sysdeps/posix/getcwd.c

> @@ -183,7 +183,7 @@ __getcwd_generic (char *buf, size_t size)

>    ino_t rootino, thisino;

>    char *dir;

>    register char *dirp;

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>    size_t allocated = size;

>    size_t used;

>  

> @@ -249,12 +249,12 @@ __getcwd_generic (char *buf, size_t size)

>    dirp = dir + allocated;

>    *--dirp = '\0';

>  

> -  if (__lstat64 (".", &st) < 0)

> +  if (__lstat64_time64 (".", &st) < 0)

>      goto lose;

>    thisdev = st.st_dev;

>    thisino = st.st_ino;

>  

> -  if (__lstat64 ("/", &st) < 0)

> +  if (__lstat64_time64 ("/", &st) < 0)

>      goto lose;

>    rootdev = st.st_dev;

>    rootino = st.st_ino;

> @@ -276,12 +276,12 @@ __getcwd_generic (char *buf, size_t size)

>        if (fd < 0)

>          goto lose;

>        fd_needs_closing = true;

> -      parent_status = __fstat64 (fd, &st);

> +      parent_status = __fstat64_time64 (fd, &st);

>  #else

>        dotlist[dotlen++] = '.';

>        dotlist[dotlen++] = '.';

>        dotlist[dotlen] = '\0';

> -      parent_status = __lstat64 (dotlist, &st);

> +      parent_status = __lstat64_time64 (dotlist, &st);

>  #endif

>        if (parent_status != 0)

>          goto lose;

> @@ -353,7 +353,8 @@ __getcwd_generic (char *buf, size_t size)

>            {

>              int entry_status;

>  #if HAVE_OPENAT_SUPPORT

> -            entry_status = __fstatat64 (fd, d->d_name, &st,

> AT_SYMLINK_NOFOLLOW);

> +            entry_status = __fstatat64_time64 (fd, d->d_name, &st,

> +					       AT_SYMLINK_NOFOLLOW);

>  #else

>              /* Compute size needed for this file name, or for the

> file name ".." in the same directory, whichever is larger.

> @@ -390,7 +391,7 @@ __getcwd_generic (char *buf, size_t size)

>                }

>  

>              memcpy (dotlist + dotlen, d->d_name, _D_ALLOC_NAMLEN

> (d));

> -            entry_status = __lstat64 (dotlist, &st);

> +            entry_status = __lstat64_time64 (dotlist, &st);

>  #endif

>              /* We don't fail here if we cannot stat() a directory

> entry. This can happen when (network) file systems fail.  If this

> diff --git a/sysdeps/posix/pathconf.c b/sysdeps/posix/pathconf.c

> index 9eb17d1536..89fcfad49d 100644

> --- a/sysdeps/posix/pathconf.c

> +++ b/sysdeps/posix/pathconf.c

> @@ -129,9 +129,9 @@ __pathconf (const char *path, int name)

>  #ifdef	_POSIX_ASYNC_IO

>        {

>  	/* AIO is only allowed on regular files and block devices.

> */

> -	struct stat64 st;

> +	struct __stat64_t64 st;

>  

> -	if (__stat64 (path, &st) < 0

> +	if (__stat64_time64 (path, &st) < 0

>  	    || (! S_ISREG (st.st_mode) && ! S_ISBLK (st.st_mode)))

>  	  return -1;

>  	else

> diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c

> index 54d6046d00..3e8ec5cd51 100644

> --- a/sysdeps/posix/sysconf.c

> +++ b/sysdeps/posix/sysconf.c

> @@ -1215,8 +1215,8 @@ __sysconf_check_spec (const char *spec)

>  		   "/POSIX_V6_", sizeof ("/POSIX_V6_") - 1),

>  	  spec, speclen + 1);

>  

> -  struct stat64 st;

> -  long int ret = __stat64 (name, &st) >= 0 ? 1 : -1;

> +  struct __stat64_t64 st;

> +  long int ret = __stat64_time64 (name, &st) >= 0 ? 1 : -1;

>  

>    __set_errno (save_errno);

>    return ret;

> diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c

> index 5f804b38d7..ff38f1e31f 100644

> --- a/sysdeps/posix/tempname.c

> +++ b/sysdeps/posix/tempname.c

> @@ -55,14 +55,14 @@

>  #include <time.h>

>  

>  #if _LIBC

> -# define struct_stat64 struct stat64

> +# define struct_stat64 struct __stat64_t64

>  # define __secure_getenv __libc_secure_getenv

>  #else

>  # define struct_stat64 struct stat

>  # define __gen_tempname gen_tempname

>  # define __mkdir mkdir

>  # define __open open

> -# define __lstat64(file, buf) lstat (file, buf)

> +# define __lstat64_time64(file, buf) lstat (file, buf)

>  # define __stat64(file, buf) stat (file, buf)

>  # define __getrandom getrandom

>  # define __clock_gettime64 clock_gettime

> @@ -99,7 +99,7 @@ static int

>  direxists (const char *dir)

>  {

>    struct_stat64 buf;

> -  return __stat64 (dir, &buf) == 0 && S_ISDIR (buf.st_mode);

> +  return __stat64_time64 (dir, &buf) == 0 && S_ISDIR (buf.st_mode);

>  }

>  

>  /* Path search algorithm, for tmpnam, tmpfile, etc.  If DIR is

> @@ -191,7 +191,7 @@ try_nocreate (char *tmpl, void *flags _GL_UNUSED)

>  {

>    struct_stat64 st;

>  

> -  if (__lstat64 (tmpl, &st) == 0 || errno == EOVERFLOW)

> +  if (__lstat64_time64 (tmpl, &st) == 0 || errno == EOVERFLOW)

>      __set_errno (EEXIST);

>    return errno == ENOENT ? 0 : -1;

>  }

> diff --git a/sysdeps/unix/sysv/linux/fdopendir.c

> b/sysdeps/unix/sysv/linux/fdopendir.c index ede43f2485..32ec10e206

> 100644 --- a/sysdeps/unix/sysv/linux/fdopendir.c

> +++ b/sysdeps/unix/sysv/linux/fdopendir.c

> @@ -27,9 +27,9 @@

>  DIR *

>  __fdopendir (int fd)

>  {

> -  struct stat64 statbuf;

> +  struct __stat64_t64 statbuf;

>  

> -  if (__builtin_expect (__fstat64 (fd, &statbuf), 0) < 0)

> +  if (__glibc_unlikely (__fstat64_time64 (fd, &statbuf) < 0))

>      return NULL;

>    if (__glibc_unlikely (! S_ISDIR (statbuf.st_mode)))

>      {

> diff --git a/sysdeps/unix/sysv/linux/fexecve.c

> b/sysdeps/unix/sysv/linux/fexecve.c index df25c2acb8..4dfcaeedc1

> 100644 --- a/sysdeps/unix/sysv/linux/fexecve.c

> +++ b/sysdeps/unix/sysv/linux/fexecve.c

> @@ -58,8 +58,8 @@ fexecve (int fd, char *const argv[], char *const

> envp[]) 

>    /* We come here only if the 'execve' call fails.  Determine whether

>       /proc is mounted.  If not we return ENOSYS.  */

> -  struct stat64 st;

> -  if (__stat64 ("/proc/self/fd", &st) != 0 && errno == ENOENT)

> +  struct __stat64_t64 st;

> +  if (__stat64_time64 ("/proc/self/fd", &st) != 0 && errno == ENOENT)

>      save = ENOSYS;

>  

>    __set_errno (save);

> diff --git a/sysdeps/unix/sysv/linux/opendir.c

> b/sysdeps/unix/sysv/linux/opendir.c index 4020a826f9..48f254d169

> 100644 --- a/sysdeps/unix/sysv/linux/opendir.c

> +++ b/sysdeps/unix/sysv/linux/opendir.c

> @@ -49,8 +49,8 @@ opendir_tail (int fd)

>    /* Now make sure this really is a directory and nothing changed

> since the `stat' call.  The S_ISDIR check is superfluous if

> O_DIRECTORY works, but it's cheap and we need the stat call for

> st_blksize anyway.  */

> -  struct stat64 statbuf;

> -  if (__glibc_unlikely (__fstat64 (fd, &statbuf) < 0))

> +  struct __stat64_t64 statbuf;

> +  if (__glibc_unlikely (__fstat64_time64 (fd, &statbuf) < 0))

>      goto lose;

>    if (__glibc_unlikely (! S_ISDIR (statbuf.st_mode)))

>      {

> @@ -88,7 +88,8 @@ __opendir (const char *name)

>  weak_alias (__opendir, opendir)

>  

>  DIR *

> -__alloc_dir (int fd, bool close_fd, int flags, const struct stat64

> *statp) +__alloc_dir (int fd, bool close_fd, int flags,

> +	     const struct __stat64_t64 *statp)

>  {

>    /* We have to set the close-on-exit flag if the user provided the

>       file descriptor.  */

> diff --git a/sysdeps/unix/sysv/linux/pathconf.c

> b/sysdeps/unix/sysv/linux/pathconf.c index f37e8aaf68..b599a66c93

> 100644 --- a/sysdeps/unix/sysv/linux/pathconf.c

> +++ b/sysdeps/unix/sysv/linux/pathconf.c

> @@ -65,9 +65,10 @@ distinguish_extX (const struct statfs *fsbuf,

> const char *file, int fd) {

>    char buf[64];

>    char path[PATH_MAX];

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>  

> -  if ((file == NULL ? __fstat64 (fd, &st) : __stat64 (file, &st)) !=

> 0)

> +  if ((file == NULL ? __fstat64_time64 (fd, &st)

> +		    : __stat64_time64 (file, &st)) != 0)

>      /* Strange.  The statfd call worked, but stat fails.  Default to

>         the more pessimistic value.  */

>      return EXT2_LINK_MAX;

> diff --git a/sysdeps/unix/sysv/linux/ttyname.h

> b/sysdeps/unix/sysv/linux/ttyname.h index 0a0048cc02..5dcbfef973

> 100644 --- a/sysdeps/unix/sysv/linux/ttyname.h

> +++ b/sysdeps/unix/sysv/linux/ttyname.h

> @@ -25,24 +25,18 @@

>     linux/Documentation/devices.txt (on linux < 4.10) or

>     linux/Documentation/admin-guide/devices.txt (on linux >= 4.10).

> */ static inline bool

> -is_pty (struct stat64 *sb)

> +is_pty (struct __stat64_t64 *sb)

>  {

> -#ifdef _STATBUF_ST_RDEV

>    int m = __gnu_dev_major (sb->st_rdev);

>    return (136 <= m && m <= 143);

> -#else

> -  return false;

> -#endif

>  }

>  

>  static inline bool

> -is_mytty (const struct stat64 *mytty, const struct stat64 *maybe)

> +is_mytty (const struct __stat64_t64 *mytty, const struct

> __stat64_t64 *maybe) {

>    return (maybe->st_ino == mytty->st_ino

>  	  && maybe->st_dev == mytty->st_dev

> -#ifdef _STATBUF_ST_RDEV

>  	  && S_ISCHR (maybe->st_mode)

>  	  && maybe->st_rdev == mytty->st_rdev

> -#endif

>  	  );

>  }

> diff --git a/sysdeps/unix/sysv/linux/ttyname_r.c

> b/sysdeps/unix/sysv/linux/ttyname_r.c index 899a851a83..9ef9f42883

> 100644 --- a/sysdeps/unix/sysv/linux/ttyname_r.c

> +++ b/sysdeps/unix/sysv/linux/ttyname_r.c

> @@ -31,15 +31,15 @@

>  #include "ttyname.h"

>  

>  static int getttyname_r (char *buf, size_t buflen,

> -			 const struct stat64 *mytty, int save,

> +			 const struct __stat64_t64 *mytty, int save,

>  			 int *dostat);

>  

>  static int

>  attribute_compat_text_section

> -getttyname_r (char *buf, size_t buflen, const struct stat64 *mytty,

> +getttyname_r (char *buf, size_t buflen, const struct __stat64_t64

> *mytty, int save, int *dostat)

>  {

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>    DIR *dirstream;

>    struct dirent64 *d;

>    size_t devlen = strlen (buf);

> @@ -71,7 +71,7 @@ getttyname_r (char *buf, size_t buflen, const

> struct stat64 *mytty, cp = __stpncpy (buf + devlen, d->d_name,

> needed); cp[0] = '\0';

>  

> -	if (__stat64 (buf, &st) == 0

> +	if (__stat64_time64 (buf, &st) == 0

>  	    && is_mytty (mytty, &st))

>  	  {

>  	    (void) __closedir (dirstream);

> @@ -93,7 +93,7 @@ int

>  __ttyname_r (int fd, char *buf, size_t buflen)

>  {

>    struct fd_to_filename filename;

> -  struct stat64 st, st1;

> +  struct __stat64_t64 st, st1;

>    int dostat = 0;

>    int doispty = 0;

>    int save = errno;

> @@ -118,7 +118,7 @@ __ttyname_r (int fd, char *buf, size_t buflen)

>    if (__glibc_unlikely (__tcgetattr (fd, &term) < 0))

>      return errno;

>  

> -  if (__fstat64 (fd, &st) < 0)

> +  if (__fstat64_time64 (fd, &st) < 0)

>      return errno;

>  

>    /* We try using the /proc filesystem.  */

> @@ -144,7 +144,7 @@ __ttyname_r (int fd, char *buf, size_t buflen)

>  

>        /* Verify readlink result, fall back on iterating through

> devices.  */ if (buf[0] == '/'

> -	  && __stat64 (buf, &st1) == 0

> +	  && __stat64_time64 (buf, &st1) == 0

>  	  && is_mytty (&st, &st1))

>  	return 0;

>  

> @@ -155,7 +155,7 @@ __ttyname_r (int fd, char *buf, size_t buflen)

>    memcpy (buf, "/dev/pts/", sizeof ("/dev/pts/"));

>    buflen -= sizeof ("/dev/pts/") - 1;

>  

> -  if (__stat64 (buf, &st1) == 0 && S_ISDIR (st1.st_mode))

> +  if (__stat64_time64 (buf, &st1) == 0 && S_ISDIR (st1.st_mode))

>      {

>        ret = getttyname_r (buf, buflen, &st, save,

>  			  &dostat);

> diff --git a/sysvipc/ftok.c b/sysvipc/ftok.c

> index 2e39c74415..bd633bd395 100644

> --- a/sysvipc/ftok.c

> +++ b/sysvipc/ftok.c

> @@ -22,10 +22,10 @@

>  key_t

>  ftok (const char *pathname, int proj_id)

>  {

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>    key_t key;

>  

> -  if (__stat64 (pathname, &st) < 0)

> +  if (__stat64_time64 (pathname, &st) < 0)

>      return (key_t) -1;

>  

>    key = ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16)

> diff --git a/time/tzfile.c b/time/tzfile.c

> index 040a5e341f..4377018a55 100644

> --- a/time/tzfile.c

> +++ b/time/tzfile.c

> @@ -150,9 +150,9 @@ __tzfile_read (const char *file, size_t extra,

> char **extrap) }

>  

>    /* If we were already using tzfile, check whether the file

> changed.  */

> -  struct stat64 st;

> +  struct __stat64_t64 st;

>    if (was_using_tzfile

> -      && __stat64 (file, &st) == 0

> +      && __stat64_time64 (file, &st) == 0

>        && tzfile_ino == st.st_ino && tzfile_dev == st.st_dev

>        && tzfile_mtime == st.st_mtime)

>      goto done;  /* Nothing to do.  */

> @@ -164,7 +164,7 @@ __tzfile_read (const char *file, size_t extra,

> char **extrap) goto ret_free_transitions;

>  

>    /* Get information about the file we are actually using.  */

> -  if (__fstat64 (__fileno (f), &st) != 0)

> +  if (__fstat64_time64 (__fileno (f), &st) != 0)

>      goto lose;

>  

>    free ((void *) transitions);


Reviewed-by: Lukasz Majewski <lukma@denx.de>



Best regards,

Lukasz Majewski

--

DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-59 Fax: (+49)-8142-66989-80 Email: lukma@denx.de
Michael Hudson-Doyle via Libc-alpha June 22, 2021, 7:37 p.m. | #2
* Adhemerval Zanella via Libc-alpha:

> diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c

> index b7e1aee80f..b2831508c4 100644

> --- a/sysdeps/posix/getaddrinfo.c

> +++ b/sysdeps/posix/getaddrinfo.c

> @@ -1636,16 +1636,17 @@ static int gaiconf_reload_flag_ever_set;

>  /* Last modification time.  */

>  #ifdef _STATBUF_ST_NSEC

>  

> -static struct timespec gaiconf_mtime;

> +static struct __timespec64 gaiconf_mtime;

>  

>  static inline void

> -save_gaiconf_mtime (const struct stat64 *st)

> +save_gaiconf_mtime (const struct __stat64_t64 *st)

>  {

> -  gaiconf_mtime = st->st_mtim;

> +  gaiconf_mtime = (struct __timespec64) { .tv_sec  = st->st_mtim.tv_sec,

> +					  .tv_nsec = st->st_mtim.tv_nsec };

>  }

>  

>  static inline bool

> -check_gaiconf_mtime (const struct stat64 *st)

> +check_gaiconf_mtime (const struct __stat64_t64 *st)

>  {

>    return (st->st_mtim.tv_sec == gaiconf_mtime.tv_sec

>            && st->st_mtim.tv_nsec == gaiconf_mtime.tv_nsec);

> @@ -1656,13 +1657,13 @@ check_gaiconf_mtime (const struct stat64 *st)

>  static time_t gaiconf_mtime;

>  

>  static inline void

> -save_gaiconf_mtime (const struct stat64 *st)

> +save_gaiconf_mtime (const struct __stat64_t64 *st)

>  {

>    gaiconf_mtime = st->st_mtime;

>  }

>  


Apparently this caused:

../sysdeps/posix/getaddrinfo.c: In function ‘save_gaiconf_mtime’:
../sysdeps/posix/getaddrinfo.c:1644:19: error: incompatible types when assigning to type ‘struct __timespec64’ from type ‘struct timespec’
 1644 |   gaiconf_mtime = st->st_mtim;
      |                   ^~

I do not know the state of 64-bit time_t on Hurd.

Thanks,
Florian
Michael Hudson-Doyle via Libc-alpha June 22, 2021, 7:51 p.m. | #3
On 22/06/2021 16:37, Florian Weimer wrote:
> * Adhemerval Zanella via Libc-alpha:

> 

>> diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c

>> index b7e1aee80f..b2831508c4 100644

>> --- a/sysdeps/posix/getaddrinfo.c

>> +++ b/sysdeps/posix/getaddrinfo.c

>> @@ -1636,16 +1636,17 @@ static int gaiconf_reload_flag_ever_set;

>>  /* Last modification time.  */

>>  #ifdef _STATBUF_ST_NSEC

>>  

>> -static struct timespec gaiconf_mtime;

>> +static struct __timespec64 gaiconf_mtime;

>>  

>>  static inline void

>> -save_gaiconf_mtime (const struct stat64 *st)

>> +save_gaiconf_mtime (const struct __stat64_t64 *st)

>>  {

>> -  gaiconf_mtime = st->st_mtim;

>> +  gaiconf_mtime = (struct __timespec64) { .tv_sec  = st->st_mtim.tv_sec,

>> +					  .tv_nsec = st->st_mtim.tv_nsec };

>>  }

>>  

>>  static inline bool

>> -check_gaiconf_mtime (const struct stat64 *st)

>> +check_gaiconf_mtime (const struct __stat64_t64 *st)

>>  {

>>    return (st->st_mtim.tv_sec == gaiconf_mtime.tv_sec

>>            && st->st_mtim.tv_nsec == gaiconf_mtime.tv_nsec);

>> @@ -1656,13 +1657,13 @@ check_gaiconf_mtime (const struct stat64 *st)

>>  static time_t gaiconf_mtime;

>>  

>>  static inline void

>> -save_gaiconf_mtime (const struct stat64 *st)

>> +save_gaiconf_mtime (const struct __stat64_t64 *st)

>>  {

>>    gaiconf_mtime = st->st_mtime;

>>  }

>>  

> 

> Apparently this caused:

> 

> ../sysdeps/posix/getaddrinfo.c: In function ‘save_gaiconf_mtime’:

> ../sysdeps/posix/getaddrinfo.c:1644:19: error: incompatible types when assigning to type ‘struct __timespec64’ from type ‘struct timespec’

>  1644 |   gaiconf_mtime = st->st_mtim;

>       |                   ^~

> 

> I do not know the state of 64-bit time_t on Hurd.


It should have re-checked against Hurd... I will fix it (hurd does not
have 64-bit time_t support afaik).

Patch

diff --git a/csu/check_fds.c b/csu/check_fds.c
index fbab28c284..6dc67334af 100644
--- a/csu/check_fds.c
+++ b/csu/check_fds.c
@@ -69,10 +69,10 @@  check_one_fd (int fd, int mode)
 	 Note that the following code assumes that STDIN_FILENO,
 	 STDOUT_FILENO, STDERR_FILENO are the three lowest file
 	 decsriptor numbers, in this order.  */
-      struct stat64 st;
-      if (__builtin_expect (nullfd != fd, 0)
-	  || __builtin_expect (__fstat64 (fd, &st), 0) != 0
-	  || __builtin_expect (S_ISCHR (st.st_mode), 1) == 0
+      struct __stat64_t64 st;
+      if (__glibc_unlikely (nullfd != fd)
+	  || __glibc_likely (__fstat64_time64 (fd, &st) != 0)
+	  || __glibc_unlikely (S_ISCHR (st.st_mode) == 0)
 	  || st.st_rdev != dev)
 	/* We cannot even give an error message here since it would
 	   run into the same problems.  */
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 918ec7546c..a08df001af 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -1946,11 +1946,11 @@  open_path (const char *name, size_t namelen, int mode,
 		{
 		  /* We failed to open machine dependent library.  Let's
 		     test whether there is any directory at all.  */
-		  struct stat64 st;
+		  struct __stat64_t64 st;
 
 		  buf[buflen - namelen - 1] = '\0';
 
-		  if (__stat64 (buf, &st) != 0
+		  if (__stat64_time64 (buf, &st) != 0
 		      || ! S_ISDIR (st.st_mode))
 		    /* The directory does not exist or it is no directory.  */
 		    this_dir->status[cnt] = nonexisting;
@@ -1968,9 +1968,9 @@  open_path (const char *name, size_t namelen, int mode,
 	      /* This is an extra security effort to make sure nobody can
 		 preload broken shared objects which are in the trusted
 		 directories and so exploit the bugs.  */
-	      struct stat64 st;
+	      struct __stat64_t64 st;
 
-	      if (__fstat64 (fd, &st) != 0
+	      if (__fstat64_time64 (fd, &st) != 0
 		  || (st.st_mode & S_ISUID) == 0)
 		{
 		  /* The shared object cannot be tested for being SUID
diff --git a/elf/dl-misc.c b/elf/dl-misc.c
index d4803bba4e..b256d792c6 100644
--- a/elf/dl-misc.c
+++ b/elf/dl-misc.c
@@ -43,11 +43,11 @@  void *
 _dl_sysdep_read_whole_file (const char *file, size_t *sizep, int prot)
 {
   void *result = MAP_FAILED;
-  struct stat64 st;
+  struct __stat64_t64 st;
   int fd = __open64_nocancel (file, O_RDONLY | O_CLOEXEC);
   if (fd >= 0)
     {
-      if (__fstat64 (fd, &st) >= 0)
+      if (__fstat64_time64 (fd, &st) >= 0)
 	{
 	  *sizep = st.st_size;
 
diff --git a/elf/dl-profile.c b/elf/dl-profile.c
index 35b03959bc..088c023d95 100644
--- a/elf/dl-profile.c
+++ b/elf/dl-profile.c
@@ -185,7 +185,7 @@  _dl_start_profile (void)
 {
   char *filename;
   int fd;
-  struct stat64 st;
+  struct __stat64_t64 st;
   const ElfW(Phdr) *ph;
   ElfW(Addr) mapstart = ~((ElfW(Addr)) 0);
   ElfW(Addr) mapend = 0;
@@ -342,7 +342,7 @@  _dl_start_profile (void)
       return;
     }
 
-  if (__fstat64 (fd, &st) < 0 || !S_ISREG (st.st_mode))
+  if (__fstat64_time64 (fd, &st) < 0 || !S_ISREG (st.st_mode))
     {
       /* Not stat'able or not a regular file => don't use it.  */
       errstr = "%s: cannot stat file: %s\n";
diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c
index 642cc731eb..68d6386d01 100644
--- a/iconv/gconv_cache.c
+++ b/iconv/gconv_cache.c
@@ -48,7 +48,7 @@  int
 __gconv_load_cache (void)
 {
   int fd;
-  struct stat64 st;
+  struct __stat64_t64 st;
   struct gconvcache_header *header;
 
   /* We cannot use the cache if the GCONV_PATH environment variable is
@@ -64,7 +64,7 @@  __gconv_load_cache (void)
     return -1;
 
   /* Get information about the file.  */
-  if (__builtin_expect (__fstat64 (fd, &st), 0) < 0
+  if (__glibc_unlikely (__fstat64_time64 (fd, &st) < 0)
       /* We do not have to start looking at the file if it cannot contain
 	 at least the cache header.  */
       || (size_t) st.st_size < sizeof (struct gconvcache_header))
diff --git a/include/dirent.h b/include/dirent.h
index f1d7e8359c..d7567f5e86 100644
--- a/include/dirent.h
+++ b/include/dirent.h
@@ -49,7 +49,7 @@  extern int __versionsort64 (const struct dirent64 **a,
 			    const struct dirent64 **b)
      __attribute_pure__;
 extern DIR *__alloc_dir (int fd, bool close_fd, int flags,
-			 const struct stat64 *statp)
+			 const struct __stat64_t64 *statp)
      __nonnull (4) attribute_hidden;
 extern __typeof (rewinddir) __rewinddir;
 extern __typeof (seekdir) __seekdir;
diff --git a/include/file_change_detection.h b/include/file_change_detection.h
index 9de2bd0b79..953de7c7fd 100644
--- a/include/file_change_detection.h
+++ b/include/file_change_detection.h
@@ -33,8 +33,8 @@  struct file_change_detection
   off64_t size;
 
   ino64_t ino;
-  struct timespec mtime;
-  struct timespec ctime;
+  struct __timespec64 mtime;
+  struct __timespec64 ctime;
 };
 
 /* Returns true if *LEFT and *RIGHT describe the same version of the
@@ -45,7 +45,7 @@  bool __file_is_unchanged (const struct file_change_detection *left,
 /* Extract file change information to *FILE from the stat buffer
    *ST.  */
 void __file_change_detection_for_stat (struct file_change_detection *file,
-                                       const struct stat64 *st);
+                                       const struct __stat64_t64 *st);
 
 /* Writes file change information for PATH to *FILE.  Returns true on
    success.  For benign errors, *FILE is cleared, and true is
diff --git a/inet/rcmd.c b/inet/rcmd.c
index 0cfdaee15e..0d6b595572 100644
--- a/inet/rcmd.c
+++ b/inet/rcmd.c
@@ -468,14 +468,14 @@  ruserok (const char *rhost, int superuser, const char *ruser,
 static FILE *
 iruserfopen (const char *file, uid_t okuser)
 {
-  struct stat64 st;
+  struct __stat64_t64 st;
   char *cp = NULL;
   FILE *res = NULL;
 
   /* If not a regular file, if owned by someone other than user or
      root, if writeable by anyone but the owner, or if hardlinked
      anywhere, quit.  */
-  if (__lstat64 (file, &st))
+  if (__lstat64_time64 (file, &st))
     cp = _("lstat failed");
   else if (!S_ISREG (st.st_mode))
     cp = _("not regular file");
@@ -484,7 +484,7 @@  iruserfopen (const char *file, uid_t okuser)
       res = fopen (file, "rce");
       if (!res)
 	cp = _("cannot open");
-      else if (__fstat64 (fileno (res), &st) < 0)
+      else if (__fstat64_time64 (fileno (res), &st) < 0)
 	cp = _("fstat failed");
       else if (st.st_uid && st.st_uid != okuser)
 	cp = _("bad owner");
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c
index 4fda9b0219..30588e9996 100644
--- a/intl/loadmsgcat.c
+++ b/intl/loadmsgcat.c
@@ -756,7 +756,7 @@  _nl_load_domain (struct loaded_l10nfile *domain_file,
   int fd = -1;
   size_t size;
 #ifdef _LIBC
-  struct stat64 st;
+  struct __stat64_t64 st;
 #else
   struct stat st;
 #endif
@@ -804,7 +804,7 @@  _nl_load_domain (struct loaded_l10nfile *domain_file,
   /* We must know about the size of the file.  */
   if (
 #ifdef _LIBC
-      __builtin_expect (__fstat64 (fd, &st) != 0, 0)
+      __builtin_expect (__fstat64_time64 (fd, &st) != 0, 0)
 #else
       __builtin_expect (fstat (fd, &st) != 0, 0)
 #endif
diff --git a/io/Makefile b/io/Makefile
index ba8bd37355..1a16990205 100644
--- a/io/Makefile
+++ b/io/Makefile
@@ -69,7 +69,7 @@  tests		:= test-utime test-stat test-stat2 test-lfs tst-getcwd \
 		   tst-posix_fallocate tst-posix_fallocate64 \
 		   tst-fts tst-fts-lfs tst-open-tmpfile \
 		   tst-copy_file_range tst-getcwd-abspath tst-lockf \
-		   tst-ftw-lnk tst-file_change_detection tst-lchmod \
+		   tst-ftw-lnk tst-lchmod \
 		   tst-ftw-bz26353 tst-stat tst-stat-lfs \
 		   tst-utime \
 		   tst-utimes \
@@ -90,7 +90,7 @@  tests-time64 := \
   tst-utimes-time64 \
 
 # Likewise for statx, but we do not need static linking here.
-tests-internal += tst-statx
+tests-internal += tst-statx tst-file_change_detection
 tests-static += tst-statx
 
 ifeq ($(run-built-tests),yes)
diff --git a/io/file_change_detection.c b/io/file_change_detection.c
index 9871bc9166..ac5e451513 100644
--- a/io/file_change_detection.c
+++ b/io/file_change_detection.c
@@ -44,7 +44,7 @@  libc_hidden_def (__file_is_unchanged)
 
 void
 __file_change_detection_for_stat (struct file_change_detection *file,
-                                  const struct stat64 *st)
+                                  const struct __stat64_t64 *st)
 {
   if (S_ISDIR (st->st_mode))
     /* Treat as empty file.  */
@@ -56,8 +56,10 @@  __file_change_detection_for_stat (struct file_change_detection *file,
     {
       file->size = st->st_size;
       file->ino = st->st_ino;
-      file->mtime = st->st_mtim;
-      file->ctime = st->st_ctim;
+      file->mtime = (struct __timespec64 ) { .tv_sec  = st->st_mtim.tv_sec,
+					     .tv_nsec = st->st_mtim.tv_nsec };
+      file->ctime = (struct __timespec64 ) { .tv_sec  = st->st_ctim.tv_sec,
+					     .tv_nsec = st->st_mtim.tv_nsec };
     }
 }
 libc_hidden_def (__file_change_detection_for_stat)
@@ -66,8 +68,8 @@  bool
 __file_change_detection_for_path (struct file_change_detection *file,
                                   const char *path)
 {
-  struct stat64 st;
-  if (__stat64 (path, &st) != 0)
+  struct __stat64_t64 st;
+  if (__stat64_time64 (path, &st) != 0)
     switch (errno)
       {
       case EACCES:
@@ -104,8 +106,8 @@  __file_change_detection_for_fp (struct file_change_detection *file,
     }
   else
     {
-      struct stat64 st;
-      if (__fstat64 (__fileno (fp), &st) != 0)
+      struct __stat64_t64 st;
+      if (__fstat64_time64 (__fileno (fp), &st) != 0)
         /* If we already have a file descriptor, all errors are fatal.  */
         return false;
       else
diff --git a/io/getdirname.c b/io/getdirname.c
index 32b5ab4b6c..f29e910b37 100644
--- a/io/getdirname.c
+++ b/io/getdirname.c
@@ -28,12 +28,12 @@  char *
 get_current_dir_name (void)
 {
   char *pwd;
-  struct stat64 dotstat, pwdstat;
+  struct __stat64_t64 dotstat, pwdstat;
 
   pwd = getenv ("PWD");
   if (pwd != NULL
-      && __stat64 (".", &dotstat) == 0
-      && __stat64 (pwd, &pwdstat) == 0
+      && __stat64_time64 (".", &dotstat) == 0
+      && __stat64_time64 (pwd, &pwdstat) == 0
       && pwdstat.st_dev == dotstat.st_dev
       && pwdstat.st_ino == dotstat.st_ino)
     /* The PWD value is correct.  Use it.  */
diff --git a/libio/filedoalloc.c b/libio/filedoalloc.c
index 7afa3cb683..c792eec88f 100644
--- a/libio/filedoalloc.c
+++ b/libio/filedoalloc.c
@@ -78,7 +78,7 @@  _IO_file_doallocate (FILE *fp)
 {
   size_t size;
   char *p;
-  struct stat64 st;
+  struct __stat64_t64 st;
 
   size = BUFSIZ;
   if (fp->_fileno >= 0 && __builtin_expect (_IO_SYSSTAT (fp, &st), 0) >= 0)
diff --git a/libio/fileops.c b/libio/fileops.c
index a71a567547..e8ee374821 100644
--- a/libio/fileops.c
+++ b/libio/fileops.c
@@ -545,7 +545,7 @@  libc_hidden_ver (_IO_new_file_underflow, _IO_file_underflow)
 static int
 mmap_remap_check (FILE *fp)
 {
-  struct stat64 st;
+  struct __stat64_t64 st;
 
   if (_IO_SYSSTAT (fp, &st) == 0
       && S_ISREG (st.st_mode) && st.st_size != 0
@@ -663,7 +663,7 @@  decide_maybe_mmap (FILE *fp)
      file descriptors are for mmap-able objects and on 32-bit
      machines we don't want to map files which are too large since
      this would require too much virtual memory.  */
-  struct stat64 st;
+  struct __stat64_t64 st;
 
   if (_IO_SYSSTAT (fp, &st) == 0
       && S_ISREG (st.st_mode) && st.st_size != 0
@@ -962,7 +962,7 @@  _IO_new_file_seekoff (FILE *fp, off64_t offset, int dir, int mode)
       break;
     case _IO_seek_end:
       {
-	struct stat64 st;
+	struct __stat64_t64 st;
 	if (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode))
 	  {
 	    offset += st.st_size;
@@ -1145,7 +1145,7 @@  libc_hidden_def (_IO_file_seek)
 int
 _IO_file_stat (FILE *fp, void *st)
 {
-  return __fstat64 (fp->_fileno, (struct stat64 *) st);
+  return __fstat64_time64 (fp->_fileno, (struct __stat64_t64 *) st);
 }
 libc_hidden_def (_IO_file_stat)
 
diff --git a/libio/oldfileops.c b/libio/oldfileops.c
index ed235360ad..ed3c98bd6d 100644
--- a/libio/oldfileops.c
+++ b/libio/oldfileops.c
@@ -487,7 +487,7 @@  _IO_old_file_seekoff (FILE *fp, off64_t offset, int dir, int mode)
       break;
     case _IO_seek_end:
       {
-	struct stat64 st;
+	struct __stat64_t64 st;
 	if (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode))
 	  {
 	    offset += st.st_size;
diff --git a/libio/wfileops.c b/libio/wfileops.c
index 5d23566171..37f44780f8 100644
--- a/libio/wfileops.c
+++ b/libio/wfileops.c
@@ -840,7 +840,7 @@  _IO_wfile_seekoff (FILE *fp, off64_t offset, int dir, int mode)
       break;
     case _IO_seek_end:
       {
-	struct stat64 st;
+	struct __stat64_t64 st;
 	if (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode))
 	  {
 	    offset += st.st_size;
diff --git a/locale/loadarchive.c b/locale/loadarchive.c
index 4177fc8972..512769eaec 100644
--- a/locale/loadarchive.c
+++ b/locale/loadarchive.c
@@ -78,7 +78,7 @@  static struct archmapped *archmapped;
    ARCHMAPPED points to this; if mapping the archive header failed,
    then headmap.ptr is null.  */
 static struct archmapped headmap;
-static struct stat64 archive_stat; /* stat of archive when header mapped.  */
+static struct __stat64_t64 archive_stat; /* stat of archive when header mapped.  */
 
 /* Record of locales that we have already loaded from the archive.  */
 struct locale_in_archive
@@ -207,7 +207,7 @@  _nl_load_locale_from_archive (int category, const char **namep)
 	/* Cannot open the archive, for whatever reason.  */
 	return NULL;
 
-      if (__fstat64 (fd, &archive_stat) == -1)
+      if (__fstat64_time64 (fd, &archive_stat) == -1)
 	{
 	  /* stat failed, very strange.  */
 	close_and_out:
@@ -396,7 +396,7 @@  _nl_load_locale_from_archive (int category, const char **namep)
 	  /* Open the file if it hasn't happened yet.  */
 	  if (fd == -1)
 	    {
-	      struct stat64 st;
+	      struct __stat64_t64 st;
 	      fd = __open_nocancel (archfname,
 				    O_RDONLY|O_LARGEFILE|O_CLOEXEC);
 	      if (fd == -1)
@@ -405,7 +405,7 @@  _nl_load_locale_from_archive (int category, const char **namep)
 	      /* Now verify we think this is really the same archive file
 		 we opened before.  If it has been changed we cannot trust
 		 the header we read previously.  */
-	      if (__fstat64 (fd, &st) < 0
+	      if (__fstat64_time64 (fd, &st) < 0
 		  || st.st_size != archive_stat.st_size
 		  || st.st_mtime != archive_stat.st_mtime
 		  || st.st_dev != archive_stat.st_dev
diff --git a/locale/loadlocale.c b/locale/loadlocale.c
index 9c03490883..f4e6cc9fc2 100644
--- a/locale/loadlocale.c
+++ b/locale/loadlocale.c
@@ -167,7 +167,7 @@  _nl_load_locale (struct loaded_l10nfile *file, int category)
 {
   int fd;
   void *filedata;
-  struct stat64 st;
+  struct __stat64_t64 st;
   struct __locale_data *newdata;
   int save_err;
   int alloc = ld_mapped;
@@ -180,7 +180,7 @@  _nl_load_locale (struct loaded_l10nfile *file, int category)
     /* Cannot open the file.  */
     return;
 
-  if (__builtin_expect (__fstat64 (fd, &st), 0) < 0)
+  if (__glibc_unlikely (__fstat64_time64 (fd, &st) < 0))
     {
     puntfd:
       __close_nocancel_nostatus (fd);
@@ -206,7 +206,7 @@  _nl_load_locale (struct loaded_l10nfile *file, int category)
       if (__builtin_expect (fd, 0) < 0)
 	return;
 
-      if (__builtin_expect (__fstat64 (fd, &st), 0) < 0)
+      if (__glibc_unlikely (__fstat64_time64 (fd, &st) < 0))
 	goto puntfd;
     }
 
diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c
index 462504d828..06ba7476e5 100644
--- a/nscd/nscd_helper.c
+++ b/nscd/nscd_helper.c
@@ -324,8 +324,8 @@  __nscd_get_mapping (request_type type, const char *key,
 
   if (__glibc_unlikely (n == keylen))
     {
-      struct stat64 st;
-      if (__builtin_expect (__fstat64 (mapfd, &st) != 0, 0)
+      struct __stat64_t64 st;
+      if (__glibc_unlikely (__fstat64_time64 (mapfd, &st) != 0)
 	  || __builtin_expect (st.st_size < sizeof (struct database_pers_head),
 			       0))
 	goto out_close;
diff --git a/nss/nss_database.c b/nss/nss_database.c
index 1e11294406..ab121cb371 100644
--- a/nss/nss_database.c
+++ b/nss/nss_database.c
@@ -394,7 +394,7 @@  nss_database_check_reload_and_get (struct nss_database_state *local,
                                    nss_action_list *result,
                                    enum nss_database database_index)
 {
-  struct stat64 str;
+  struct __stat64_t64 str;
 
   /* Acquire MO is needed because the thread that sets reload_disabled
      may have loaded the configuration first, so synchronize with the
@@ -424,7 +424,7 @@  nss_database_check_reload_and_get (struct nss_database_state *local,
      errors here are very unlikely, but the chance that we're entering
      a container is also very unlikely, so we err on the side of both
      very unlikely things not happening at the same time.  */
-  if (__stat64 ("/", &str) != 0
+  if (__stat64_time64 ("/", &str) != 0
       || (local->root_ino != 0
 	  && (str.st_ino != local->root_ino
 	      ||  str.st_dev != local->root_dev)))
diff --git a/sysdeps/posix/dl-fileid.h b/sysdeps/posix/dl-fileid.h
index 0bb6794dbe..bf437f3d71 100644
--- a/sysdeps/posix/dl-fileid.h
+++ b/sysdeps/posix/dl-fileid.h
@@ -32,9 +32,9 @@  struct r_file_id
 static inline bool
 _dl_get_file_id (int fd, struct r_file_id *id)
 {
-  struct stat64 st;
+  struct __stat64_t64 st;
 
-  if (__glibc_unlikely (__fstat64 (fd, &st) < 0))
+  if (__glibc_unlikely (__fstat64_time64 (fd, &st) < 0))
     return false;
 
   id->dev = st.st_dev;
diff --git a/sysdeps/posix/euidaccess.c b/sysdeps/posix/euidaccess.c
index 26ebb432a2..86f3285471 100644
--- a/sysdeps/posix/euidaccess.c
+++ b/sysdeps/posix/euidaccess.c
@@ -119,7 +119,7 @@  int group_member ();
 int
 euidaccess (const char *path, int mode)
 {
-  struct stat64 stats;
+  struct __stat64_t64 stats;
   int granted;
 
 #ifdef	_LIBC
@@ -140,7 +140,7 @@  euidaccess (const char *path, int mode)
     return access (path, mode);
 #endif
 
-  if (__stat64 (path, &stats))
+  if (__stat64_time64 (path, &stats))
     return -1;
 
   mode &= (X_OK | W_OK | R_OK);	/* Clear any bogus bits. */
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index b7e1aee80f..b2831508c4 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -1636,16 +1636,17 @@  static int gaiconf_reload_flag_ever_set;
 /* Last modification time.  */
 #ifdef _STATBUF_ST_NSEC
 
-static struct timespec gaiconf_mtime;
+static struct __timespec64 gaiconf_mtime;
 
 static inline void
-save_gaiconf_mtime (const struct stat64 *st)
+save_gaiconf_mtime (const struct __stat64_t64 *st)
 {
-  gaiconf_mtime = st->st_mtim;
+  gaiconf_mtime = (struct __timespec64) { .tv_sec  = st->st_mtim.tv_sec,
+					  .tv_nsec = st->st_mtim.tv_nsec };
 }
 
 static inline bool
-check_gaiconf_mtime (const struct stat64 *st)
+check_gaiconf_mtime (const struct __stat64_t64 *st)
 {
   return (st->st_mtim.tv_sec == gaiconf_mtime.tv_sec
           && st->st_mtim.tv_nsec == gaiconf_mtime.tv_nsec);
@@ -1656,13 +1657,13 @@  check_gaiconf_mtime (const struct stat64 *st)
 static time_t gaiconf_mtime;
 
 static inline void
-save_gaiconf_mtime (const struct stat64 *st)
+save_gaiconf_mtime (const struct __stat64_t64 *st)
 {
   gaiconf_mtime = st->st_mtime;
 }
 
 static inline bool
-check_gaiconf_mtime (const struct stat64 *st)
+check_gaiconf_mtime (const struct __stat64_t64 *st)
 {
   return st->st_mtime == gaiconf_mtime;
 }
@@ -1777,8 +1778,8 @@  gaiconf_init (void)
   FILE *fp = fopen (GAICONF_FNAME, "rce");
   if (fp != NULL)
     {
-      struct stat64 st;
-      if (__fstat64 (fileno (fp), &st) != 0)
+      struct __stat64_t64 st;
+      if (__fstat64_time64 (fileno (fp), &st) != 0)
 	{
 	  fclose (fp);
 	  goto no_file;
@@ -2130,8 +2131,8 @@  gaiconf_init (void)
 static void
 gaiconf_reload (void)
 {
-  struct stat64 st;
-  if (__stat64 (GAICONF_FNAME, &st) != 0
+  struct __stat64_t64 st;
+  if (__stat64_time64 (GAICONF_FNAME, &st) != 0
       || !check_gaiconf_mtime (&st))
     gaiconf_init ();
 }
diff --git a/sysdeps/posix/getcwd.c b/sysdeps/posix/getcwd.c
index f11644aae7..13680026ff 100644
--- a/sysdeps/posix/getcwd.c
+++ b/sysdeps/posix/getcwd.c
@@ -183,7 +183,7 @@  __getcwd_generic (char *buf, size_t size)
   ino_t rootino, thisino;
   char *dir;
   register char *dirp;
-  struct stat64 st;
+  struct __stat64_t64 st;
   size_t allocated = size;
   size_t used;
 
@@ -249,12 +249,12 @@  __getcwd_generic (char *buf, size_t size)
   dirp = dir + allocated;
   *--dirp = '\0';
 
-  if (__lstat64 (".", &st) < 0)
+  if (__lstat64_time64 (".", &st) < 0)
     goto lose;
   thisdev = st.st_dev;
   thisino = st.st_ino;
 
-  if (__lstat64 ("/", &st) < 0)
+  if (__lstat64_time64 ("/", &st) < 0)
     goto lose;
   rootdev = st.st_dev;
   rootino = st.st_ino;
@@ -276,12 +276,12 @@  __getcwd_generic (char *buf, size_t size)
       if (fd < 0)
         goto lose;
       fd_needs_closing = true;
-      parent_status = __fstat64 (fd, &st);
+      parent_status = __fstat64_time64 (fd, &st);
 #else
       dotlist[dotlen++] = '.';
       dotlist[dotlen++] = '.';
       dotlist[dotlen] = '\0';
-      parent_status = __lstat64 (dotlist, &st);
+      parent_status = __lstat64_time64 (dotlist, &st);
 #endif
       if (parent_status != 0)
         goto lose;
@@ -353,7 +353,8 @@  __getcwd_generic (char *buf, size_t size)
           {
             int entry_status;
 #if HAVE_OPENAT_SUPPORT
-            entry_status = __fstatat64 (fd, d->d_name, &st, AT_SYMLINK_NOFOLLOW);
+            entry_status = __fstatat64_time64 (fd, d->d_name, &st,
+					       AT_SYMLINK_NOFOLLOW);
 #else
             /* Compute size needed for this file name, or for the file
                name ".." in the same directory, whichever is larger.
@@ -390,7 +391,7 @@  __getcwd_generic (char *buf, size_t size)
               }
 
             memcpy (dotlist + dotlen, d->d_name, _D_ALLOC_NAMLEN (d));
-            entry_status = __lstat64 (dotlist, &st);
+            entry_status = __lstat64_time64 (dotlist, &st);
 #endif
             /* We don't fail here if we cannot stat() a directory entry.
                This can happen when (network) file systems fail.  If this
diff --git a/sysdeps/posix/pathconf.c b/sysdeps/posix/pathconf.c
index 9eb17d1536..89fcfad49d 100644
--- a/sysdeps/posix/pathconf.c
+++ b/sysdeps/posix/pathconf.c
@@ -129,9 +129,9 @@  __pathconf (const char *path, int name)
 #ifdef	_POSIX_ASYNC_IO
       {
 	/* AIO is only allowed on regular files and block devices.  */
-	struct stat64 st;
+	struct __stat64_t64 st;
 
-	if (__stat64 (path, &st) < 0
+	if (__stat64_time64 (path, &st) < 0
 	    || (! S_ISREG (st.st_mode) && ! S_ISBLK (st.st_mode)))
 	  return -1;
 	else
diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c
index 54d6046d00..3e8ec5cd51 100644
--- a/sysdeps/posix/sysconf.c
+++ b/sysdeps/posix/sysconf.c
@@ -1215,8 +1215,8 @@  __sysconf_check_spec (const char *spec)
 		   "/POSIX_V6_", sizeof ("/POSIX_V6_") - 1),
 	  spec, speclen + 1);
 
-  struct stat64 st;
-  long int ret = __stat64 (name, &st) >= 0 ? 1 : -1;
+  struct __stat64_t64 st;
+  long int ret = __stat64_time64 (name, &st) >= 0 ? 1 : -1;
 
   __set_errno (save_errno);
   return ret;
diff --git a/sysdeps/posix/tempname.c b/sysdeps/posix/tempname.c
index 5f804b38d7..ff38f1e31f 100644
--- a/sysdeps/posix/tempname.c
+++ b/sysdeps/posix/tempname.c
@@ -55,14 +55,14 @@ 
 #include <time.h>
 
 #if _LIBC
-# define struct_stat64 struct stat64
+# define struct_stat64 struct __stat64_t64
 # define __secure_getenv __libc_secure_getenv
 #else
 # define struct_stat64 struct stat
 # define __gen_tempname gen_tempname
 # define __mkdir mkdir
 # define __open open
-# define __lstat64(file, buf) lstat (file, buf)
+# define __lstat64_time64(file, buf) lstat (file, buf)
 # define __stat64(file, buf) stat (file, buf)
 # define __getrandom getrandom
 # define __clock_gettime64 clock_gettime
@@ -99,7 +99,7 @@  static int
 direxists (const char *dir)
 {
   struct_stat64 buf;
-  return __stat64 (dir, &buf) == 0 && S_ISDIR (buf.st_mode);
+  return __stat64_time64 (dir, &buf) == 0 && S_ISDIR (buf.st_mode);
 }
 
 /* Path search algorithm, for tmpnam, tmpfile, etc.  If DIR is
@@ -191,7 +191,7 @@  try_nocreate (char *tmpl, void *flags _GL_UNUSED)
 {
   struct_stat64 st;
 
-  if (__lstat64 (tmpl, &st) == 0 || errno == EOVERFLOW)
+  if (__lstat64_time64 (tmpl, &st) == 0 || errno == EOVERFLOW)
     __set_errno (EEXIST);
   return errno == ENOENT ? 0 : -1;
 }
diff --git a/sysdeps/unix/sysv/linux/fdopendir.c b/sysdeps/unix/sysv/linux/fdopendir.c
index ede43f2485..32ec10e206 100644
--- a/sysdeps/unix/sysv/linux/fdopendir.c
+++ b/sysdeps/unix/sysv/linux/fdopendir.c
@@ -27,9 +27,9 @@ 
 DIR *
 __fdopendir (int fd)
 {
-  struct stat64 statbuf;
+  struct __stat64_t64 statbuf;
 
-  if (__builtin_expect (__fstat64 (fd, &statbuf), 0) < 0)
+  if (__glibc_unlikely (__fstat64_time64 (fd, &statbuf) < 0))
     return NULL;
   if (__glibc_unlikely (! S_ISDIR (statbuf.st_mode)))
     {
diff --git a/sysdeps/unix/sysv/linux/fexecve.c b/sysdeps/unix/sysv/linux/fexecve.c
index df25c2acb8..4dfcaeedc1 100644
--- a/sysdeps/unix/sysv/linux/fexecve.c
+++ b/sysdeps/unix/sysv/linux/fexecve.c
@@ -58,8 +58,8 @@  fexecve (int fd, char *const argv[], char *const envp[])
 
   /* We come here only if the 'execve' call fails.  Determine whether
      /proc is mounted.  If not we return ENOSYS.  */
-  struct stat64 st;
-  if (__stat64 ("/proc/self/fd", &st) != 0 && errno == ENOENT)
+  struct __stat64_t64 st;
+  if (__stat64_time64 ("/proc/self/fd", &st) != 0 && errno == ENOENT)
     save = ENOSYS;
 
   __set_errno (save);
diff --git a/sysdeps/unix/sysv/linux/opendir.c b/sysdeps/unix/sysv/linux/opendir.c
index 4020a826f9..48f254d169 100644
--- a/sysdeps/unix/sysv/linux/opendir.c
+++ b/sysdeps/unix/sysv/linux/opendir.c
@@ -49,8 +49,8 @@  opendir_tail (int fd)
   /* Now make sure this really is a directory and nothing changed since the
      `stat' call.  The S_ISDIR check is superfluous if O_DIRECTORY works,
      but it's cheap and we need the stat call for st_blksize anyway.  */
-  struct stat64 statbuf;
-  if (__glibc_unlikely (__fstat64 (fd, &statbuf) < 0))
+  struct __stat64_t64 statbuf;
+  if (__glibc_unlikely (__fstat64_time64 (fd, &statbuf) < 0))
     goto lose;
   if (__glibc_unlikely (! S_ISDIR (statbuf.st_mode)))
     {
@@ -88,7 +88,8 @@  __opendir (const char *name)
 weak_alias (__opendir, opendir)
 
 DIR *
-__alloc_dir (int fd, bool close_fd, int flags, const struct stat64 *statp)
+__alloc_dir (int fd, bool close_fd, int flags,
+	     const struct __stat64_t64 *statp)
 {
   /* We have to set the close-on-exit flag if the user provided the
      file descriptor.  */
diff --git a/sysdeps/unix/sysv/linux/pathconf.c b/sysdeps/unix/sysv/linux/pathconf.c
index f37e8aaf68..b599a66c93 100644
--- a/sysdeps/unix/sysv/linux/pathconf.c
+++ b/sysdeps/unix/sysv/linux/pathconf.c
@@ -65,9 +65,10 @@  distinguish_extX (const struct statfs *fsbuf, const char *file, int fd)
 {
   char buf[64];
   char path[PATH_MAX];
-  struct stat64 st;
+  struct __stat64_t64 st;
 
-  if ((file == NULL ? __fstat64 (fd, &st) : __stat64 (file, &st)) != 0)
+  if ((file == NULL ? __fstat64_time64 (fd, &st)
+		    : __stat64_time64 (file, &st)) != 0)
     /* Strange.  The statfd call worked, but stat fails.  Default to
        the more pessimistic value.  */
     return EXT2_LINK_MAX;
diff --git a/sysdeps/unix/sysv/linux/ttyname.h b/sysdeps/unix/sysv/linux/ttyname.h
index 0a0048cc02..5dcbfef973 100644
--- a/sysdeps/unix/sysv/linux/ttyname.h
+++ b/sysdeps/unix/sysv/linux/ttyname.h
@@ -25,24 +25,18 @@ 
    linux/Documentation/devices.txt (on linux < 4.10) or
    linux/Documentation/admin-guide/devices.txt (on linux >= 4.10).  */
 static inline bool
-is_pty (struct stat64 *sb)
+is_pty (struct __stat64_t64 *sb)
 {
-#ifdef _STATBUF_ST_RDEV
   int m = __gnu_dev_major (sb->st_rdev);
   return (136 <= m && m <= 143);
-#else
-  return false;
-#endif
 }
 
 static inline bool
-is_mytty (const struct stat64 *mytty, const struct stat64 *maybe)
+is_mytty (const struct __stat64_t64 *mytty, const struct __stat64_t64 *maybe)
 {
   return (maybe->st_ino == mytty->st_ino
 	  && maybe->st_dev == mytty->st_dev
-#ifdef _STATBUF_ST_RDEV
 	  && S_ISCHR (maybe->st_mode)
 	  && maybe->st_rdev == mytty->st_rdev
-#endif
 	  );
 }
diff --git a/sysdeps/unix/sysv/linux/ttyname_r.c b/sysdeps/unix/sysv/linux/ttyname_r.c
index 899a851a83..9ef9f42883 100644
--- a/sysdeps/unix/sysv/linux/ttyname_r.c
+++ b/sysdeps/unix/sysv/linux/ttyname_r.c
@@ -31,15 +31,15 @@ 
 #include "ttyname.h"
 
 static int getttyname_r (char *buf, size_t buflen,
-			 const struct stat64 *mytty, int save,
+			 const struct __stat64_t64 *mytty, int save,
 			 int *dostat);
 
 static int
 attribute_compat_text_section
-getttyname_r (char *buf, size_t buflen, const struct stat64 *mytty,
+getttyname_r (char *buf, size_t buflen, const struct __stat64_t64 *mytty,
 	      int save, int *dostat)
 {
-  struct stat64 st;
+  struct __stat64_t64 st;
   DIR *dirstream;
   struct dirent64 *d;
   size_t devlen = strlen (buf);
@@ -71,7 +71,7 @@  getttyname_r (char *buf, size_t buflen, const struct stat64 *mytty,
 	cp = __stpncpy (buf + devlen, d->d_name, needed);
 	cp[0] = '\0';
 
-	if (__stat64 (buf, &st) == 0
+	if (__stat64_time64 (buf, &st) == 0
 	    && is_mytty (mytty, &st))
 	  {
 	    (void) __closedir (dirstream);
@@ -93,7 +93,7 @@  int
 __ttyname_r (int fd, char *buf, size_t buflen)
 {
   struct fd_to_filename filename;
-  struct stat64 st, st1;
+  struct __stat64_t64 st, st1;
   int dostat = 0;
   int doispty = 0;
   int save = errno;
@@ -118,7 +118,7 @@  __ttyname_r (int fd, char *buf, size_t buflen)
   if (__glibc_unlikely (__tcgetattr (fd, &term) < 0))
     return errno;
 
-  if (__fstat64 (fd, &st) < 0)
+  if (__fstat64_time64 (fd, &st) < 0)
     return errno;
 
   /* We try using the /proc filesystem.  */
@@ -144,7 +144,7 @@  __ttyname_r (int fd, char *buf, size_t buflen)
 
       /* Verify readlink result, fall back on iterating through devices.  */
       if (buf[0] == '/'
-	  && __stat64 (buf, &st1) == 0
+	  && __stat64_time64 (buf, &st1) == 0
 	  && is_mytty (&st, &st1))
 	return 0;
 
@@ -155,7 +155,7 @@  __ttyname_r (int fd, char *buf, size_t buflen)
   memcpy (buf, "/dev/pts/", sizeof ("/dev/pts/"));
   buflen -= sizeof ("/dev/pts/") - 1;
 
-  if (__stat64 (buf, &st1) == 0 && S_ISDIR (st1.st_mode))
+  if (__stat64_time64 (buf, &st1) == 0 && S_ISDIR (st1.st_mode))
     {
       ret = getttyname_r (buf, buflen, &st, save,
 			  &dostat);
diff --git a/sysvipc/ftok.c b/sysvipc/ftok.c
index 2e39c74415..bd633bd395 100644
--- a/sysvipc/ftok.c
+++ b/sysvipc/ftok.c
@@ -22,10 +22,10 @@ 
 key_t
 ftok (const char *pathname, int proj_id)
 {
-  struct stat64 st;
+  struct __stat64_t64 st;
   key_t key;
 
-  if (__stat64 (pathname, &st) < 0)
+  if (__stat64_time64 (pathname, &st) < 0)
     return (key_t) -1;
 
   key = ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16)
diff --git a/time/tzfile.c b/time/tzfile.c
index 040a5e341f..4377018a55 100644
--- a/time/tzfile.c
+++ b/time/tzfile.c
@@ -150,9 +150,9 @@  __tzfile_read (const char *file, size_t extra, char **extrap)
     }
 
   /* If we were already using tzfile, check whether the file changed.  */
-  struct stat64 st;
+  struct __stat64_t64 st;
   if (was_using_tzfile
-      && __stat64 (file, &st) == 0
+      && __stat64_time64 (file, &st) == 0
       && tzfile_ino == st.st_ino && tzfile_dev == st.st_dev
       && tzfile_mtime == st.st_mtime)
     goto done;  /* Nothing to do.  */
@@ -164,7 +164,7 @@  __tzfile_read (const char *file, size_t extra, char **extrap)
     goto ret_free_transitions;
 
   /* Get information about the file we are actually using.  */
-  if (__fstat64 (__fileno (f), &st) != 0)
+  if (__fstat64_time64 (__fileno (f), &st) != 0)
     goto lose;
 
   free ((void *) transitions);