Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 25 Jul 2012 21:59:11 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r238780 - head/usr.bin/find
Message-ID:  <201207252159.q6PLxB5o004252@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Wed Jul 25 21:59:10 2012
New Revision: 238780
URL: http://svn.freebsd.org/changeset/base/238780

Log:
  find: Implement real -ignore_readdir_race.
  
  If -ignore_readdir_race is present, [ENOENT] errors caused by deleting a
  file after find has read its name from a directory are ignored.
  
  Formerly, -ignore_readdir_race did nothing.
  
  PR:		bin/169723
  Submitted by:	Valery Khromov and Andrey Ignatov

Modified:
  head/usr.bin/find/extern.h
  head/usr.bin/find/find.1
  head/usr.bin/find/find.c
  head/usr.bin/find/function.c
  head/usr.bin/find/main.c
  head/usr.bin/find/option.c

Modified: head/usr.bin/find/extern.h
==============================================================================
--- head/usr.bin/find/extern.h	Wed Jul 25 21:32:55 2012	(r238779)
+++ head/usr.bin/find/extern.h	Wed Jul 25 21:59:10 2012	(r238780)
@@ -58,6 +58,7 @@ creat_f	c_flags;
 creat_f	c_follow;
 creat_f	c_fstype;
 creat_f	c_group;
+creat_f	c_ignore_readdir_race;
 creat_f	c_inum;
 creat_f	c_links;
 creat_f	c_ls;
@@ -111,7 +112,8 @@ exec_f	f_size;
 exec_f	f_type;
 exec_f	f_user;
 
-extern int ftsoptions, isdeprecated, isdepth, isoutput, issort, isxargs;
+extern int ftsoptions, ignore_readdir_race, isdeprecated, isdepth, isoutput;
+extern int issort, isxargs;
 extern int mindepth, maxdepth;
 extern int regexp_flags;
 extern time_t now;

Modified: head/usr.bin/find/find.1
==============================================================================
--- head/usr.bin/find/find.1	Wed Jul 25 21:32:55 2012	(r238779)
+++ head/usr.bin/find/find.1	Wed Jul 25 21:59:10 2012	(r238780)
@@ -31,7 +31,7 @@
 .\"	@(#)find.1	8.7 (Berkeley) 5/9/95
 .\" $FreeBSD$
 .\"
-.Dd June 13, 2012
+.Dd July 25, 2012
 .Dt FIND 1
 .Os
 .Sh NAME
@@ -470,7 +470,9 @@ is numeric and there is no such group na
 .Ar gname
 is treated as a group ID.
 .It Ic -ignore_readdir_race
-This option is for GNU find compatibility and is ignored.
+Ignore errors because a file or a directory is deleted
+after reading the name from a directory.
+This option does not affect errors occurring on starting points.
 .It Ic -ilname Ar pattern
 Like
 .Ic -lname ,
@@ -618,7 +620,9 @@ is equivalent to
 .It Ic -nogroup
 True if the file belongs to an unknown group.
 .It Ic -noignore_readdir_race
-This option is for GNU find compatibility and is ignored.
+Turn off the effect of
+.Ic -ignore_readdir_race .
+This is default behaviour.
 .It Ic -noleaf
 This option is for GNU find compatibility.
 In GNU find it disables an optimization not relevant to

Modified: head/usr.bin/find/find.c
==============================================================================
--- head/usr.bin/find/find.c	Wed Jul 25 21:32:55 2012	(r238779)
+++ head/usr.bin/find/find.c	Wed Jul 25 21:59:10 2012	(r238780)
@@ -197,8 +197,12 @@ find_execute(PLAN *plan, char *paths[])
 				continue;
 			break;
 		case FTS_DNR:
-		case FTS_ERR:
 		case FTS_NS:
+			if (ignore_readdir_race &&
+			    entry->fts_errno == ENOENT && entry->fts_level > 0)
+				continue;
+			/* FALLTHROUGH */
+		case FTS_ERR:
 			(void)fflush(stdout);
 			warnx("%s: %s",
 			    entry->fts_path, strerror(entry->fts_errno));
@@ -228,7 +232,7 @@ find_execute(PLAN *plan, char *paths[])
 		for (p = plan; p && (p->execute)(p, entry); p = p->next);
 	}
 	finish_execplus();
-	if (errno)
+	if (errno && (!ignore_readdir_race || errno != ENOENT))
 		err(1, "fts_read");
 	return (rval);
 }

Modified: head/usr.bin/find/function.c
==============================================================================
--- head/usr.bin/find/function.c	Wed Jul 25 21:32:55 2012	(r238779)
+++ head/usr.bin/find/function.c	Wed Jul 25 21:59:10 2012	(r238780)
@@ -975,6 +975,25 @@ c_group(OPTION *option, char ***argvp)
 }
 
 /*
+ * -ignore_readdir_race functions --
+ *
+ *	Always true. Ignore errors which occur if a file or a directory
+ *	in a starting point gets deleted between reading the name and calling
+ *	stat on it while find is traversing the starting point.
+ */
+
+PLAN *
+c_ignore_readdir_race(OPTION *option, char ***argvp __unused)
+{
+	if (strcmp(option->name, "-ignore_readdir_race") == 0)
+		ignore_readdir_race = 1;
+	else
+		ignore_readdir_race = 0;
+
+	return palloc(option);
+}
+
+/*
  * -inum n functions --
  *
  *	True if the file has inode # n.

Modified: head/usr.bin/find/main.c
==============================================================================
--- head/usr.bin/find/main.c	Wed Jul 25 21:32:55 2012	(r238779)
+++ head/usr.bin/find/main.c	Wed Jul 25 21:59:10 2012	(r238780)
@@ -64,6 +64,7 @@ __FBSDID("$FreeBSD$");
 time_t now;			/* time find was run */
 int dotfd;			/* starting directory */
 int ftsoptions;			/* options for the ftsopen(3) call */
+int ignore_readdir_race = 0;	/* ignore readdir race */
 int isdeprecated;		/* using deprecated syntax */
 int isdepth;			/* do directories on post-order visit */
 int isoutput;			/* user specified output operator */

Modified: head/usr.bin/find/option.c
==============================================================================
--- head/usr.bin/find/option.c	Wed Jul 25 21:32:55 2012	(r238779)
+++ head/usr.bin/find/option.c	Wed Jul 25 21:59:10 2012	(r238780)
@@ -88,7 +88,7 @@ static OPTION const options[] = {
 	{ "-fstype",	c_fstype,	f_fstype,	0 },
 	{ "-gid",	c_group,	f_group,	0 },
 	{ "-group",	c_group,	f_group,	0 },
-	{ "-ignore_readdir_race",c_simple, f_always_true,0 },
+	{ "-ignore_readdir_race",c_ignore_readdir_race, f_always_true,0 },
 	{ "-ilname",	c_name,		f_name,		F_LINK | F_IGNCASE },
 	{ "-iname",	c_name,		f_name,		F_IGNCASE },
 	{ "-inum",	c_inum,		f_inum,		0 },
@@ -127,7 +127,7 @@ static OPTION const options[] = {
 	{ "-newermm",	c_newer,	f_newer,	0 },
 	{ "-newermt",	c_newer,	f_newer,	F_TIME2_T },
 	{ "-nogroup",	c_nogroup,	f_nogroup,	0 },
-	{ "-noignore_readdir_race",c_simple, f_always_true,0 },
+	{ "-noignore_readdir_race",c_ignore_readdir_race, f_always_true,0 },
 	{ "-noleaf",	c_simple,	f_always_true,	0 },
 	{ "-not",	c_simple,	f_not,		0 },
 	{ "-nouser",	c_nouser,	f_nouser,	0 },



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201207252159.q6PLxB5o004252>