bug-coreutils
[Top][All Lists]
Advanced

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

Re: coreutils-6.3 on Linux 2.4 kernel


From: Paul Eggert
Subject: Re: coreutils-6.3 on Linux 2.4 kernel
Date: Thu, 05 Oct 2006 14:40:43 -0700
User-agent: Gnus/5.1008 (Gnus v5.10.8) Emacs/21.4 (gnu/linux)

Bruno Haible <address@hidden> writes:

> 1) dd/misc fails: kernel does not support NOATIME (already reported).

I installed the following patch in an attempt to fix this.  (This
doesn't affect the other problem you reported in that message, about
ls/stat-dtype.)

However, I can't test this easily since I don't have such a kernel.

Most of this patch is to gnulib, so I'll CC: this to bug-gnulib.

2006-10-05  Paul Eggert  <address@hidden>

        * lib/fcntl_.h (O_NOFOLLOW): Don't depend on O_NOFOLLOW_IS_INEFFECTIVE;
        we now test for that separately.
        * lib/fts.c (fts_safe_changedir): Inspect HAVE_WORKING_O_NOFOLLOW
        rather than O_NOFOLLOW, when testing whether it's possible to
        avoid a race condition reliably.
        * lib/savewd.c (savewd_chdir): Likewise.

        * m4/fcntl_h.m4 (gl_FCNTL_H): Define HAVE_WORKING_O_NOFOLLOW instead
        of O_NOFOLLOW_IS_INEFFECTIVE.  Define HAVE_WORKING_O_NOATIME if
        O_NOATIME works.

        * src/dd.c (flags): noatime and nofollow now depend on
        HAVE_WORKING_O_NOATIME and HAVE_WORKING_O_NOFOLLOW, too.
        (usage): Output info about noatime and nofollow only if
        they are known to work.
        * src/remove.c (AD_push): Inspect HAVE_WORKING_O_NOFOLLOW rather
        than O_NOFOLLOW, when testing whether it's possible to avoid a
        race condition reliably.

Index: lib/fcntl_.h
===================================================================
RCS file: /cvsroot/gnulib/gnulib/lib/fcntl_.h,v
retrieving revision 1.1
diff -u -r1.1 fcntl_.h
--- lib/fcntl_.h        28 Aug 2006 22:59:17 -0000      1.1
+++ lib/fcntl_.h        5 Oct 2006 21:37:44 -0000
@@ -59,9 +59,6 @@
 # define O_NOCTTY 0
 #endif

-#ifdef O_NOFOLLOW_IS_INEFFECTIVE
-# undef O_NOFOLLOW
-#endif
 #ifndef O_NOFOLLOW
 # define O_NOFOLLOW 0
 #endif
Index: lib/fts.c
===================================================================
RCS file: /cvsroot/gnulib/gnulib/lib/fts.c,v
retrieving revision 1.18
diff -u -r1.18 fts.c
--- lib/fts.c   4 Oct 2006 17:21:22 -0000       1.18
+++ lib/fts.c   5 Oct 2006 21:37:44 -0000
@@ -1421,7 +1421,7 @@
           general (when the target is not ".."), diropen's use of
           O_NOFOLLOW ensures we don't mistakenly follow a symlink,
           so we can avoid the expense of this fstat.  */
-       if (ISSET(FTS_LOGICAL) || O_NOFOLLOW == 0
+       if (ISSET(FTS_LOGICAL) || ! HAVE_WORKING_O_NOFOLLOW
            || (dir && STREQ (dir, "..")))
          {
            struct stat sb;
Index: lib/savewd.c
===================================================================
RCS file: /cvsroot/gnulib/gnulib/lib/savewd.c,v
retrieving revision 1.3
diff -u -r1.3 savewd.c
--- lib/savewd.c        26 Sep 2006 23:33:11 -0000      1.3
+++ lib/savewd.c        5 Oct 2006 21:37:44 -0000
@@ -103,7 +103,8 @@

   /* Open the directory if requested, or if avoiding a race condition
      is requested and possible.  */
-  if (open_result || (options & (O_NOFOLLOW ? SAVEWD_CHDIR_NOFOLLOW : 0)))
+  if (open_result
+      || (options & (HAVE_WORKING_O_NOFOLLOW ? SAVEWD_CHDIR_NOFOLLOW : 0)))
     {
       fd = open (dir,
                 (O_RDONLY | O_DIRECTORY | O_NOCTTY | O_NONBLOCK
Index: m4/fcntl_h.m4
===================================================================
RCS file: /cvsroot/gnulib/gnulib/m4/fcntl_h.m4,v
retrieving revision 1.2
diff -u -r1.2 fcntl_h.m4
--- m4/fcntl_h.m4       25 Sep 2006 13:02:15 -0000      1.2
+++ m4/fcntl_h.m4       5 Oct 2006 21:37:44 -0000
@@ -15,6 +15,9 @@
           #include <sys/stat.h>
           #include <unistd.h>
           #include <fcntl.h>
+          #ifndef O_NOATIME
+           #define O_NOATIME 0
+          #endif
           #ifndef O_NOFOLLOW
            #define O_NOFOLLOW 0
           #endif
@@ -24,23 +27,52 @@
              O_NONBLOCK, O_SYNC, O_ACCMODE, O_RDONLY, O_RDWR, O_WRONLY
            };
          ]],
-         [[static char const sym[] = "conftest.sym";
-           if (O_NOFOLLOW)
-             {
-               if (symlink (".", sym) != 0)
-                 return 1;
-               if (0 <= open (sym, O_RDONLY | O_NOFOLLOW))
-                 return 1;
-             }
-           return !constants;]])],
+         [[
+           int status = !constants;
+           {
+             static char const sym[] = "conftest.sym";
+             if (symlink (".", sym) != 0
+                 || close (open (sym, O_RDONLY | O_NOFOLLOW)) == 0)
+               status |= 32;
+           }
+           {
+             static char const file[] = "confdefs.h";
+             int fd = open (file, O_RDONLY | O_NOATIME);
+             char c;
+             struct stat st0, st1;
+             if (fd < 0
+                 || fstat (fd, &st0) != 0
+                 || sleep (1) != 0
+                 || read (fd, &c, 1) != 1
+                 || close (fd) != 0
+                 || stat (file, &st1) != 0
+                 || st1.st_mtime <= st0.st_mtime
+                 || close (fd) != 0)
+               status |= 64;
+           }
+           return status;]])],
        [gl_cv_header_working_fcntl_h=yes],
-       [gl_cv_header_working_fcntl_h=no],
+       [case $? in #(
+       32) gl_cv_header_working_fcntl_h='no (bad O_NOFOLLOW)';; #(
+       64) gl_cv_header_working_fcntl_h='no (bad O_NOATIME)';; #(
+       96) gl_cv_header_working_fcntl_h='no (bad O_NOATIME, O_NOFOLLOW)';; #(
+        *) gl_cv_header_working_fcntl_h='no';;
+       esac],
        [gl_cv_header_working_fcntl_h=cross-compiling])])

-  if test $gl_cv_header_working_fcntl_h != yes; then
-    AC_DEFINE([O_NOFOLLOW_IS_INEFFECTIVE], 1,
-      [Define to 1 if O_NOFOLLOW is ineffective.])
-  fi
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOATIME* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOATIME], [$ac_val],
+    [Define to 1 if O_NOATIME works.])
+
+  case $gl_cv_header_working_fcntl_h in #(
+  *O_NOFOLLOW* | no | cross-compiling) ac_val=0;; #(
+  *) ac_val=1;;
+  esac
+  AC_DEFINE_UNQUOTED([HAVE_WORKING_O_NOFOLLOW], [$ac_val],
+    [Define to 1 if O_NOFOLLOW works.])

   gl_ABSOLUTE_HEADER([fcntl.h])
   ABSOLUTE_FCNTL_H=\"$gl_cv_absolute_fcntl_h\"



Index: src/dd.c
===================================================================
RCS file: /fetish/cu/src/dd.c,v
retrieving revision 1.198
diff -u -r1.198 dd.c
--- src/dd.c    16 Aug 2006 19:36:46 -0000      1.198
+++ src/dd.c    5 Oct 2006 21:38:36 -0000
@@ -265,9 +265,9 @@
   {"direct",   O_DIRECT},
   {"directory",        O_DIRECTORY},
   {"dsync",    O_DSYNC},
-  {"noatime",  O_NOATIME},
+  {"noatime",  HAVE_WORKING_O_NOATIME ? O_NOATIME : 0},
   {"noctty",   O_NOCTTY},
-  {"nofollow", O_NOFOLLOW},
+  {"nofollow", HAVE_WORKING_O_NOFOLLOW ? O_NOFOLLOW : 0},
   {"nolinks",  O_NOLINKS},
   {"nonblock", O_NONBLOCK},
   {"sync",     O_SYNC},
@@ -470,12 +470,12 @@
        fputs (_("  sync      likewise, but also for metadata\n"), stdout);
       if (O_NONBLOCK)
        fputs (_("  nonblock  use non-blocking I/O\n"), stdout);
-      if (O_NOATIME)
+      if (HAVE_WORKING_O_NOATIME)
        fputs (_("  noatime   do not update access time\n"), stdout);
       if (O_NOCTTY)
        fputs (_("  noctty    do not assign controlling terminal from file\n"),
               stdout);
-      if (O_NOFOLLOW)
+      if (HAVE_WORKING_O_NOFOLLOW)
        fputs (_("  nofollow  do not follow symlinks\n"), stdout);
       if (O_NOLINKS)
        fputs (_("  nolinks   fail if multiply-linked\n"), stdout);
Index: src/remove.c
===================================================================
RCS file: /fetish/cu/src/remove.c,v
retrieving revision 1.165
diff -u -r1.165 remove.c
--- src/remove.c        3 Oct 2006 22:06:31 -0000       1.165
+++ src/remove.c        5 Oct 2006 21:38:36 -0000
@@ -621,7 +621,7 @@

   /* If our uses of openat are guaranteed not to
      follow a symlink, then we can skip this check.  */
-  if ( ! O_NOFOLLOW)
+  if (! HAVE_WORKING_O_NOFOLLOW)
     {
       struct stat sb;
       if (fstat (fd_cwd, &sb) != 0)




reply via email to

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