[PATCH v5 2/2] io: Use gnulib fts implementation (BZ 22944, BZ 20331)
Collin Funk
collin.funk1@gmail.com
Fri Apr 3 06:42:07 GMT 2026
Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> This patch synchronizes the glibc fts implementation with the latest
> version from gnulib (as of 2026-02-16).
>
> The primary motivation is to address limitations in the legacy glibc
> implementation, most notably BZ 22944, where fts fails with an
> ENAMETOOLONG error when traversing very long paths or deeply nested
> directory trees. The gnulib implementation dynamically reallocates
> path buffers and uses openat/fchdir optimizations, effectively
> lifting the MAXPATHLEN limitation.
>
> The gnulib implementation also added extra features, which are
> used by different GNU projects (coreutils, diffutils):
>
> * FTS_TIGHT_CYCLE_CHECK: used to enable a strict, immediate
> cycle-detection algorithm during a file system traversal. This is
> done internally using a hash table: every time the traversal enters
> a directory, it records the directory's device and inode (dev/ino)
> pair in the hash table, and before entering any directory, fts
> checks the hash table.
>
> * FTS_CWDFD: instead of actually changing the process's current
> working directory, it maintains a virtual current working directory
> using file descriptors. The file descriptor is store at the
> fts_cwd_fd field and all subsequent file operations are performed
> relative to this file descriptor using *at functions.
>
> * FTS_DEFER_STAT: performance-oriented flag that instructs the file
> tree traversal engine to delay fetching file metadata. When the
> flag is used, fts skips the immediate stat call. Instead, it marks
> the entry with a special internal state (FTS_NSOK and
> FTS_STAT_REQUIRED). The actual stat call is pushed down the line
> and executed by fts_read right before the application actually
> accesses the entry.
>
> * FTS_VERBATIM: fts_open aaccept and use the path strings exactly as
> they were provided in the arguments array without slash trimming.
>
> * FTS_MOUNT: it restrict the file tree walk to a single file system.
>
> Hopefully,it would allow some GNU projects to use the glibc
> implementation instead of pulling the gnulib one.
>
> It requires some changes to keep compatibility, compared to gnulib:
>
> * The new required fields are added at the end of FTS structure, and
> the new FTS flags are adjusted to avoid change FTS_NAMEONLY/FTS_STOP
> (even though they are marked as private).
>
> * The FTSENT uses a flexible array (fts_name), so two adjustments are
> required: the two new members (fts_fts and fts_dirp) are place
> *before* the struct and the fts_statp is now always allocated and
> accounted (the gnulib implementation uses a awalys allocated member).
>
> Checked on x86_64-linux-gnu and i686-linux-gnu.
> --
> Changes from v4:
> * I_ring struct, typedef, and enum under the "__*".
> ---
This looks good to me. Thanks again for working on this.
Reviewed-by: Collin Funk <collin.funk1@gmail.com>
Collin
More information about the Libc-alpha
mailing list