bug-gnulib
[Top][All Lists]
Advanced

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

[PATCH 1/2] fts: introduce the FTS_NOLEAF flag


From: Kamil Dudka
Subject: [PATCH 1/2] fts: introduce the FTS_NOLEAF flag
Date: Wed, 9 Dec 2015 07:34:55 +0100

The flag is needed to implement the -noleaf option of find.
* lib/fts.c (link_count_optimize_ok): Implement the FTS_NOLEAF flag.
* lib/fts_.h (FTS_NOLEAF): New macro, shifted conflicting constants.
---
 lib/fts.c  |  4 ++++
 lib/fts_.h | 12 +++++++++---
 2 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/lib/fts.c b/lib/fts.c
index ea73675..76bbc06 100644
--- a/lib/fts.c
+++ b/lib/fts.c
@@ -781,6 +781,10 @@ link_count_optimize_ok (FTSENT const *p)
   bool opt_ok;
   struct LCO_ent *t2;
 
+  if (ISSET(FTS_NOLEAF))
+    /* leaf optimization explicitly disabled by the FTS_NOLEAF flag */
+    return false;
+
   /* If we're not in CWDFD mode, don't bother with this optimization,
      since the caller is not serious about performance. */
   if (!ISSET(FTS_CWDFD))
diff --git a/lib/fts_.h b/lib/fts_.h
index b9a3f12..1a500fc 100644
--- a/lib/fts_.h
+++ b/lib/fts_.h
@@ -155,10 +155,16 @@ typedef struct {
      from input path names during fts_open initialization.  */
 # define FTS_VERBATIM   0x1000
 
-# define FTS_OPTIONMASK 0x1fff          /* valid user option mask */
+  /* Disable leaf optimization (which eliminates stat() calls during traversal,
+     based on the count of nested directories stored in stat.st_nlink of each
+     directory).  Note that the optimization is by default enabled only for
+     selected file systems, and only if the FTS_CWDFD flag is set.  */
+# define FTS_NOLEAF     0x2000
 
-# define FTS_NAMEONLY   0x2000          /* (private) child names only */
-# define FTS_STOP       0x4000          /* (private) unrecoverable error */
+# define FTS_OPTIONMASK 0x3fff          /* valid user option mask */
+
+# define FTS_NAMEONLY   0x4000          /* (private) child names only */
+# define FTS_STOP       0x8000          /* (private) unrecoverable error */
         int fts_options;                /* fts_open options, global flags */
 
         /* Map a directory's device number to a boolean.  The boolean is
-- 
2.5.0




reply via email to

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