bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] avoid stat/fstat in statvfs/fstatvfs


From: Eric Wong
Subject: Re: [PATCH] avoid stat/fstat in statvfs/fstatvfs
Date: Fri, 8 Feb 2013 00:02:26 +0000
User-agent: Mutt/1.5.21 (2010-09-15)

Roland McGrath <address@hidden> wrote:
> The patch itself now looks fine to me.  The log entry is inadequate.
> It needs to mention each file and function touched and say what was
> done there.  "Update caller." is sufficient text for a function to
> which the only change was trivial argument reordering or whatnot.  But
> in most of these cases, each caller dropped a stat* call as well and
> so it needs to say "Pass it -1 instead of calling stat64." or suchlike.

Sorry about that.  Here is an updated patch with ChangeLog.
------------------------------- 8< ---------------------------
>From 92f694865d0014bffd0069c549c4a6274e2f1430 Mon Sep 17 00:00:00 2001
From: Eric Wong <address@hidden>
Date: Fri, 1 Feb 2013 01:55:27 +0000
Subject: [PATCH] avoid stat/fstat in statvfs/fstatvfs

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.

2013-02-08  Eric Wong  <address@hidden>

        * sysdeps/unix/sysv/linux/internal_statvfs.c (__statvfs_getflags):
        Call fstat64 or stat64 internally, depending on arguments passed.
        Replace stat buffer argument with file descriptor argument.
        (INTERNAL_STATVFS): Update arguments to match __statvfs_getflags.
        * sysdeps/unix/sysv/linux/fstatvfs.c (fstatvfs):
        Pass fd to __internal_statvfs instead of calling fstat64.
        * sysdeps/unix/sysv/linux/fstatvfs64.c (__fstatvfs64):
        Pass fd to __internal_statvfs64 instead of calling fstat64.
        * sysdeps/unix/sysv/linux/statvfs.c (statvfs):
        Pass -1 to __internal_statvfs instead of calling stat64.
        * sysdeps/unix/sysv/linux/statvfs64.c (__statvfs64):
        Pass -1 to __internal_statvfs64 instead of calling stat64.

diff --git a/sysdeps/unix/sysv/linux/fstatvfs.c 
b/sysdeps/unix/sysv/linux/fstatvfs.c
index 8f08d14..6a03a87 100644
--- a/sysdeps/unix/sysv/linux/fstatvfs.c
+++ b/sysdeps/unix/sysv/linux/fstatvfs.c
@@ -22,7 +22,7 @@
 #include <sys/statvfs.h>
 
 extern void __internal_statvfs (const char *name, struct statvfs *buf,
-                               struct statfs *fsbuf, struct stat64 *st);
+                               struct statfs *fsbuf, int fd);
 
 
 int
@@ -36,7 +36,7 @@ fstatvfs (int fd, struct statvfs *buf)
     return -1;
 
   /* Convert the result.  */
-  __internal_statvfs (NULL, buf, &fsbuf, fstat64 (fd, &st) == -1 ? NULL : &st);
+  __internal_statvfs (NULL, buf, &fsbuf, fd);
 
   /* 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 2dcef94..3b49ab2 100644
--- a/sysdeps/unix/sysv/linux/fstatvfs64.c
+++ b/sysdeps/unix/sysv/linux/fstatvfs64.c
@@ -25,7 +25,7 @@
 
 
 extern void __internal_statvfs64 (const char *name, struct statvfs64 *buf,
-                                 struct statfs64 *fsbuf, struct stat64 *st);
+                                 struct statfs64 *fsbuf, int fd);
 
 
 /* Return information about the filesystem on which FD resides.  */
@@ -60,12 +60,8 @@ __fstatvfs64 (int fd, struct statvfs64 *buf)
 #endif
 
   if (res == 0)
-    {
-      /* Convert the result.  */
-      struct stat64 st;
-      __internal_statvfs64 (NULL, buf, &fsbuf,
-                           fstat64 (fd, &st) == -1 ? NULL : &st);
-    }
+    /* Convert the result.  */
+    __internal_statvfs64 (NULL, buf, &fsbuf, fd);
 
   return res;
 }
diff --git a/sysdeps/unix/sysv/linux/internal_statvfs.c 
b/sysdeps/unix/sysv/linux/internal_statvfs.c
index 4cd4f04..1e1ad5f 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;
@@ -153,7 +155,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.  */
@@ -216,14 +218,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;
@@ -266,7 +267,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;
diff --git a/sysdeps/unix/sysv/linux/statvfs.c 
b/sysdeps/unix/sysv/linux/statvfs.c
index 5d91d85..09b53f7 100644
--- a/sysdeps/unix/sysv/linux/statvfs.c
+++ b/sysdeps/unix/sysv/linux/statvfs.c
@@ -22,22 +22,20 @@
 #include <sys/statvfs.h>
 
 extern void __internal_statvfs (const char *name, struct statvfs *buf,
-                               struct statfs *fsbuf, struct stat64 *st);
+                               struct statfs *fsbuf, int fd);
 
 
 int
 statvfs (const char *file, struct statvfs *buf)
 {
   struct statfs fsbuf;
-  struct stat64 st;
 
   /* Get as much information as possible from the system.  */
   if (__statfs (file, &fsbuf) < 0)
     return -1;
 
   /* Convert the result.  */
-  __internal_statvfs (file, buf, &fsbuf,
-                     stat64 (file, &st) == -1 ? NULL : &st);
+  __internal_statvfs (file, buf, &fsbuf, -1);
 
   /* 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 42c1089..cd9a7ca 100644
--- a/sysdeps/unix/sysv/linux/statvfs64.c
+++ b/sysdeps/unix/sysv/linux/statvfs64.c
@@ -26,7 +26,7 @@
 
 
 extern void __internal_statvfs64 (const char *name, struct statvfs64 *buf,
-                                 struct statfs64 *fsbuf, struct stat64 *st);
+                                 struct statfs64 *fsbuf, int fd);
 
 
 /* Return information about the filesystem on which FILE resides.  */
@@ -61,12 +61,8 @@ __statvfs64 (const char *file, struct statvfs64 *buf)
 #endif
 
   if (res == 0)
-    {
-      /* Convert the result.  */
-      struct stat64 st;
-      __internal_statvfs64 (file, buf, &fsbuf,
-                           stat64 (file, &st) == -1 ? NULL : &st);
-    }
+    /* Convert the result.  */
+    __internal_statvfs64 (file, buf, &fsbuf, -1);
 
   return res;
 }
-- 
Eric Wong



reply via email to

[Prev in Thread] Current Thread [Next in Thread]