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