[LTP] [PATCH] listmount04: Detect EBADF behavior dynamically at runtime

Petr Vorel pvorel@suse.cz
Fri Jul 24 14:11:14 CEST 2026


> Upstream commit 78f0e33cd6c9 ("fs/namespace: correctly handle errors
> returned by grab_requested_mnt_ns") changed the errno from EINVAL to
> EBADF when an invalid mount namespace file descriptor is passed to
> listmount(). This change has been backported to various stable kernels
> (e.g., 6.12.59 LTS).

> Instead of hardcoding version checks for every stable backport, probe
> the behavior dynamically in setup() by calling listmount() with an
> invalid fd (-1) and checking the returned errno.

> Signed-off-by: Wake Liu <wakel@google.com>
> ---
>  .../kernel/syscalls/listmount/listmount04.c   | 27 ++++++++++++++++---
>  1 file changed, 23 insertions(+), 4 deletions(-)

> diff --git a/testcases/kernel/syscalls/listmount/listmount04.c b/testcases/kernel/syscalls/listmount/listmount04.c
> index 919f4c854..f7343608f 100644
> --- a/testcases/kernel/syscalls/listmount/listmount04.c
> +++ b/testcases/kernel/syscalls/listmount/listmount04.c
> @@ -153,16 +153,35 @@ static void run(unsigned int n)
>  	}

>  	TST_EXP_FAIL(tst_syscall(__NR_listmount, req, tc->mnt_ids,
> -		tc->nr_mnt_ids, tc->flags), tc->exp_errno,
> -		"%s", tc->msg);
> +				 tc->nr_mnt_ids, tc->flags),
> +		     tc->exp_errno,
> +		     "%s", tc->msg);
>  }

>  static void setup(void)
>  {
> -	if (tst_kvercmp(6, 17, 9) >= 0)
> +	mnt_id_req req = {
> +		.size = MNT_ID_REQ_SIZE_VER0,
> +		.mnt_id = LSMT_ROOT,
> +		.mnt_ns_fd = -1,
> +	};
> +	uint64_t ids[MNT_SIZE];
> +
> +	TEST(tst_syscall(__NR_listmount, &req, ids, MNT_SIZE, 0));
I wonder if we should use listmount() from listmount.h.

> +	if (TST_RET >= 0)
> +		tst_brk(TBROK, "listmount() succeeded unexpectedly with invalid fd");
Maybe we could have TST_EXP_FAIL_ARR_SILENT_BRK() in the future :)

> +
> +	if (TST_ERR == EBADF) {
>  		kver = AFTER_6_17_9;
At this point we may rename macros back to AFTER_6_18 and BEFORE_6_18, with
keeping note that it got backported into stable.

> -	else
> +		tst_res(TINFO, "Detected kernel with EBADF behavior for invalid mnt_ns_fd");
> +	} else if (TST_ERR == EINVAL) {
>  		kver = BEFORE_6_17_9;
> +		tst_res(TINFO, "Detected kernel with EINVAL behavior for invalid mnt_ns_fd");
> +	} else if (TST_ERR == ENOSYS) {
> +		tst_brk(TCONF, "listmount() syscall not supported");
This is IMHO not supported, because it's part of tst_syscall().
Other than this LGTM.
Reviewed-by: Petr Vorel <pvorel@suse.cz>

Kind regards,
Petr

> +	} else {
> +		tst_brk(TBROK | TTERRNO, "Unexpected error during probe");
> +	}


More information about the ltp mailing list