changeset 12271:a58d32199602

fts: do not fail on a submount during traversal * lib/fts.c (fts_build): Read the stat info again after opening a directory if the FTS_TIGHT_CYCLE_CHECK flag is set. Original report at http://bugzilla.redhat.com/501848.
author Kamil Dudka <kdudka@redhat.com>
date Tue, 10 Nov 2009 14:26:56 +0100
parents b8dd652dae80
children 1660263d2a54
files ChangeLog lib/fts.c
diffstat 2 files changed, 21 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-11-10  Kamil Dudka  <kdudka@redhat.com>
+
+	fts: do not fail on a submount during traversal
+	* lib/fts.c (fts_build): Read the stat info again after opening
+	a directory if the FTS_TIGHT_CYCLE_CHECK flag is set.
+	Original report at http://bugzilla.redhat.com/501848.
+
 2009-11-12  Jim Meyering  <meyering@redhat.com>
 
 	bootstrap: sync from coreutils
--- a/lib/fts.c
+++ b/lib/fts.c
@@ -1268,6 +1268,20 @@
 	  opening it.  */
        if (cur->fts_info == FTS_NSOK)
 	 cur->fts_info = fts_stat(sp, cur, false);
+       else if (sp->fts_options & FTS_TIGHT_CYCLE_CHECK) {
+		/* Now read the stat info again after opening a directory to
+		 * reveal eventual changes caused by a submount triggered by
+		 * the traversal.  But do it only for utilities which use
+		 * FTS_TIGHT_CYCLE_CHECK.  Therefore, only find and du
+		 * benefit/suffer from this feature for now.
+		 */
+		LEAVE_DIR (sp, cur, "4");
+		fts_stat (sp, cur, false);
+		if (! enter_dir (sp, cur)) {
+			 __set_errno (ENOMEM);
+			 return NULL;
+		}
+	}
 
 	/*
 	 * Nlinks is the number of possible entries of type directory in the