On Saturday, September 2, 2017 5:35:31 PM CEST James Youngman wrote: > * gnulib-local/lib/fts.c.diff: incorporated from a patch by Kamil > Dudka <kdu...@redhat.com>. This patch introduces an FTS_NOLEAF option > to fts. > * gnulib-local/lib/fts_.h.diff: Likewise. > * find/ftsfind.c (ftsoptions): point out that is_fts_enabled > reflects the settings made in the initialization of ftsoptions, > not the modifications made later to it (e.g. FTS_NOLEAF). > (find): Set fts_options |= FTS_NOLEAF when the -noleaf option was > specified. With -D search, the debugging output now shows the > options passed to fts_open. > (is_fts_enabled): Point out that the result doesn't reflect any > dynamic changes to ftsoptions (e.g. FTS_NOLEAF). > * Makefile.am (EXTRA_DIST): Distribute fts.c.diff and fts_.h.diff in > gnulib-local/lib. These diffs will be applied to the gnulib sources > by gnulib-tool (hence, the gnulib code shipped in the source tarball > will already include these patches). > * find/parser.c (parse_version): For the FTS feature, indicate > whether FTS_NOLEAF is available (but not whether it was used; for > that you have to use the command-line flag -D search).
Looks good. Thank you for working on this! I have verified on a reiserfs file system that it works as expected. Please consider applying the following fixup to make the patch apply better on up2date gnulib code: --- a/gnulib-local/lib/fts.c.diff +++ b/gnulib-local/lib/fts.c.diff @@ -10,14 +10,14 @@ 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; +@@ -738,6 +738,10 @@ filesystem_type (FTSENT const *p) + struct dev_type *ent; + struct statfs fs_buf; + if (ISSET(FTS_NOLEAF)) + /* leaf optimization explicitly disabled by the FTS_NOLEAF flag */ -+ return false; ++ return 0; + /* 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)) + since the caller is not serious about performance. */ + if (!ISSET (FTS_CWDFD))