Re: [LTP] [PATCH v5] listmount04.c: Update case support mnt_id_req.mnt_ns_fd

Cyril Hrubis
2025-12-12T12:56:10Z

Hi!
> > -#ifndef HAVE_STRUCT_MNT_ID_REQ
> > -struct mnt_id_req {
> > +struct mnt_id_req_fallback {
> > uint32_t size;
> > - uint32_t spare;
> > + uint32_t mnt_ns_fd;
> > uint64_t mnt_id;
> > uint64_t param;
> > uint64_t mnt_ns_id;
> > };
> > +
> > +#if !defined(HAVE_STRUCT_MNT_ID_REQ) || !HAVE_STRUCT_MNT_ID_REQ_MNT_NS_FD
> Shouldn't be !HAVE_STRUCT_MNT_ID_REQ_MNT_NS_FD
> !defined(HAVE_STRUCT_MNT_ID_REQ_MNT_NS_FD) ?
>
> Also, this patchset introduces compilation error on old systems:
>
> In file included from listmount03.c:13:0:
> listmount.h:20:4: error: 'struct mnt_id_req' has no member named 'mnt_id'
> .mnt_id = mnt_id,
>
> Obviously some definition is wrong.

That looks like we need configure check for mnt_id too however that
happens in a different test.

> https://github.com/pevik/ltp/actions/runs/20166087670/job/57889711762
>
> (CI does not work, therefore I pushed you patchset.)
>
> > +typedef struct mnt_id_req_fallback mnt_id_req;
> > +#else
> > +typedef struct mnt_id_req mnt_id_req;
> > #endif
>
> ...
> > +static void setup(void)
> > +{
> > + if (tst_kvercmp(6, 18, 0) >= 0) {
> > + tcases[4].exp_errno = EBADF;
> > + tcases[4].msg = "invalid mnt_id_req.mnt_ns_fd (EBADF)";
>
> Hardcoding array index is asking for problems in the future.
>
> That's why I suggested more complicated code in previous version.
> https://lore.kernel.org/ltp/20251211115111.GA63924@pevik/

Another solution would be to define testcases for both for EINVAL and
EBADF and add a flag which should be enabled on newer kernel:

#define BEFORE_6_18 1
#define AFTER_6_18 2

...
{
.req_usage = 1,
.size = MNT_ID_REQ_SIZE_VER0,
.spare = -1,
.mnt_id = LSMT_ROOT,
.mnt_ids = mnt_ids,
.nr_mnt_ids = MNT_SIZE,
.exp_errno = EINVAL,
.msg = "invalid mnt_id_req.spare",
.kver = BEFORE_6_18,
},
{
.req_usage = 1,
.size = MNT_ID_REQ_SIZE_VER0,
.spare = -1,
.mnt_id = LSMT_ROOT,
.mnt_ids = mnt_ids,
.nr_mnt_ids = MNT_SIZE,
.exp_errno = EBADF,
.msg = "invalid mnt_id_req.mnt_nf_fd",
.kver = AFTER_6_18,
},
...

static void run(...)
{
...

if (tc->kver && tc->kver != kver)
return;

...
}

static void setup(void)
{
if (tst_kvercmp(6, 18, 0) >= 0)
kver = AFTER_6_18;
else
kver = BEFORE_6_18;
}

--
Cyril Hrubis
chrubis@suse.cz