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

Wake Liu wakel@google.com
Mon Jul 27 14:21:19 CEST 2026


Hi Petr,

Thanks for the review. I've just sent out v2.

To address your comments:
- listmount() helper: We can't use it here because it constructs the
request struct internally with `mnt_ns_fd = 0`. We need to set
`mnt_ns_fd = -1` to trigger the error behavior we are probing.
- Macro rename: Renamed BEFORE/AFTER_6_17_9 to BEFORE/AFTER_6_18 and
added a note about stable backports.
- ENOSYS check: Removed since `.min_kver = "6.11"` guarantees listmount support.

Best regards,
Wake


On Fri, Jul 24, 2026 at 8:11 PM Petr Vorel <pvorel@suse.cz> wrote:
>
> > 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");
> > +     }



-- 
Best Regards,
Wake Liu


More information about the ltp mailing list