[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