[Top][All Lists]
[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)