diff options
author | Eric Wong <normalperson@yhbt.net> | 2014-05-29 09:41:29 +0530 |
---|---|---|
committer | Siddhesh Poyarekar <siddhesh@redhat.com> | 2014-05-29 09:41:29 +0530 |
commit | 26b0d2e1a1606da10c4dc4e109d7b9f2d92aab6a (patch) | |
tree | 80f00460ffda84fa25dae201b40c5442646cf213 /sysdeps/unix/sysv/linux/internal_statvfs.c | |
parent | 0d3b7a190c3abbdce27d4b0b9f16517bf5664099 (diff) | |
download | glibc-26b0d2e1a1606da10c4dc4e109d7b9f2d92aab6a.tar glibc-26b0d2e1a1606da10c4dc4e109d7b9f2d92aab6a.tar.gz glibc-26b0d2e1a1606da10c4dc4e109d7b9f2d92aab6a.tar.bz2 glibc-26b0d2e1a1606da10c4dc4e109d7b9f2d92aab6a.zip |
Avoid stat/fstat in statvfs/fstatvfs (BZ #15132)
Delay the use of stat/fstat until stat data is required. When the
kernel returns ST_VALID, stat data is not used by __internal_statvfs.
Diffstat (limited to 'sysdeps/unix/sysv/linux/internal_statvfs.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/internal_statvfs.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/sysdeps/unix/sysv/linux/internal_statvfs.c b/sysdeps/unix/sysv/linux/internal_statvfs.c index 2424c138ac..d71ed0cd72 100644 --- a/sysdeps/unix/sysv/linux/internal_statvfs.c +++ b/sysdeps/unix/sysv/linux/internal_statvfs.c @@ -43,9 +43,11 @@ # ifndef __ASSUME_STATFS_F_FLAGS int -__statvfs_getflags (const char *name, int fstype, struct stat64 *st) +__statvfs_getflags (const char *name, int fstype, int fd) { - if (st == NULL) + struct stat64 st; + + if ((fd < 0 ? stat64 (name, &st) : fstat64 (fd, &st)) < 0) return 0; const char *fsname = NULL; @@ -159,7 +161,7 @@ __statvfs_getflags (const char *name, int fstype, struct stat64 *st) /* Find out about the device the current entry is for. */ struct stat64 fsst; if (stat64 (mntbuf.mnt_dir, &fsst) >= 0 - && st->st_dev == fsst.st_dev) + && st.st_dev == fsst.st_dev) { /* Bingo, we found the entry for the device FD is on. Now interpret the option string. */ @@ -222,14 +224,13 @@ __statvfs_getflags (const char *name, int fstype, struct stat64 *st) } # endif #else -extern int __statvfs_getflags (const char *name, int fstype, - struct stat64 *st); +extern int __statvfs_getflags (const char *name, int fstype, int fd); #endif void INTERNAL_STATVFS (const char *name, struct STATVFS *buf, - struct STATFS *fsbuf, struct stat64 *st) + struct STATFS *fsbuf, int fd) { /* Now fill in the fields we have information for. */ buf->f_bsize = fsbuf->f_bsize; @@ -272,7 +273,7 @@ INTERNAL_STATVFS (const char *name, struct STATVFS *buf, the /etc/mtab file and search for the entry which matches the given file. The way we can test for matching filesystem is using the device number. */ - buf->f_flag = __statvfs_getflags (name, fsbuf->f_type, st); + buf->f_flag = __statvfs_getflags (name, fsbuf->f_type, fd); else #endif buf->f_flag = fsbuf->f_flags ^ ST_VALID; |