[PATCH v2] io: Do not alias fts and fts64 when inode types differ

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Wed Aug 26 17:15:01 GMT 2026



On 09/08/26 09:40, Magnus Lindholm wrote:
> The fts and fts64 interfaces can share an implementation only when
> both their offset and inode types have matching layouts.
> 
> The existing conditions check only whether off_t and off64_t match.
> On Alpha, these types match, but ino_t and ino64_t differ.
> Consequently, FTSENT and FTSENT64 have different layouts.
> 
> The ordinary fts implementation is therefore omitted on Alpha, and
> the ordinary fts symbols are instead aliased to the fts64
> implementation. This causes the ordinary interface to operate on an
> incompatible FTSENT64 layout and corrupts traversal state.
> 
> Build the ordinary implementation unless both the offset and inode
> types match. Likewise, alias the ordinary symbols to the fts64
> implementation only when both types match.
> 
> An audit of the bits/typesizes.h implementations shows that Alpha is
> the only ABI where __OFF_T_MATCHES_OFF64_T is defined but
> __INO_T_MATCHES_INO64_T is not. Therefore, this changes the
> implementation selection only on Alpha.
> 
> This fixes io/tst-fts, io/tst-fts-bz22944, and io/tst-fts-newflags on
> Alpha.
> 
> Signed-off-by: Magnus Lindholm <linmag7@gmail.com>

I think it is worth to track this with a bugzilla, but LGTM.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
> 
> Changes in v2:
> - Drop the Alpha-specific fts.c and fts64.c wrappers, which are no
>   longer needed after b9a2dea54abd.
> - Audit bits/typesizes.h implementations.  Alpha is the only ABI where
>   __OFF_T_MATCHES_OFF64_T is defined without
>   __INO_T_MATCHES_INO64_T.
> 
> Tested on alpha-linux-gnu (ES40):
>   PASS: io/tst-fts
>   PASS: io/tst-fts-bz22944
>   PASS: io/tst-fts-newflags
> 
> The complete io testsuite reports 79 PASS and 2 UNSUPPORTED, with no
> failures.
> 
> v1: https://inbox.sourceware.org/libc-alpha/20260803190118.3090469-1-linmag7@gmail.com/
> 
>  io/fts.c   | 3 ++-
>  io/fts64.c | 3 ++-
>  2 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/io/fts.c b/io/fts.c
> index d3b8e5a100..c7df552b83 100644
> --- a/io/fts.c
> +++ b/io/fts.c
> @@ -18,6 +18,7 @@
>  
>  #include <sys/types.h>
>  
> -#ifndef __OFF_T_MATCHES_OFF64_T
> +#if !defined __OFF_T_MATCHES_OFF64_T \
> +    || !defined __INO_T_MATCHES_INO64_T
>  # include "io/fts-common.c"
>  #endif
> diff --git a/io/fts64.c b/io/fts64.c
> index 1efa06ab3b..c2cf45523e 100644
> --- a/io/fts64.c
> +++ b/io/fts64.c
> @@ -50,7 +50,8 @@ weak_alias (__fts64_read, fts64_read)
>  weak_alias (__fts64_set, fts64_set)
>  weak_alias (__fts64_children, fts64_children)
>  
> -#ifdef __OFF_T_MATCHES_OFF64_T
> +#if defined __OFF_T_MATCHES_OFF64_T \
> +    && defined __INO_T_MATCHES_INO64_T
>  weak_alias (__fts64_open, fts_open)
>  weak_alias (__fts64_close, fts_close)
>  weak_alias (__fts64_read, fts_read)



More information about the Libc-alpha mailing list