Message ID | 20240516-listmount_statmount-v3-4-2ff4ba29bba7@suse.com |
---|---|
State | Accepted |
Headers | show |
Series | statmount/listmount testing suites | expand |
Hi! > --- /dev/null > +++ b/testcases/kernel/syscalls/listmount/listmount01.c > @@ -0,0 +1,66 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > +/* > + * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> > + */ > + > +/*\ > + * [Description] > + * > + * This test verifies that listmount() is properly recognizing a mounted > + * root directory using LSMT_ROOT flag. > + * > + * [Algorithm] > + * > + * * move into a new unshared namespace > + * * mount() a root inside temporary folder and get its mount ID > + * * get list of mounted IDs using listmount(LSMT_ROOT, ..) > + * * verify that the root mount ID is the only mount ID present inside the list Can we please use dashes here instead of asterisks? It's kind of hard to read asterisk based list inside of C comments... > + */ > + > +#include "listmount.h" > +#include "lapi/stat.h" > +#include "lapi/sched.h" > + > +#define MNTPOINT "mntpoint" > +#define LISTSIZE 32 > + > +static uint64_t root_id; > + > +static void run(void) > +{ > + uint64_t list[LISTSIZE]; > + > + TST_EXP_POSITIVE(listmount(LSMT_ROOT, 0, list, LISTSIZE, 0)); > + if (TST_RET == -1) > + return; > + > + TST_EXP_EQ_LI(TST_RET, 1); > + TST_EXP_EQ_LI(list[0], root_id); > +} > + > +static void setup(void) > +{ > + struct statx sx; > + > + SAFE_UNSHARE(CLONE_NEWNS); > + > + SAFE_CHROOT(MNTPOINT); > + SAFE_MOUNT("", "/", NULL, MS_REC | MS_PRIVATE, NULL); > + SAFE_STATX(AT_FDCWD, "/", 0, STATX_MNT_ID_UNIQUE, &sx); > + > + root_id = sx.stx_mnt_id; > +} > + > +static struct tst_test test = { > + .test_all = run, > + .setup = setup, > + .forks_child = 1, > + .min_kver = "6.8", > + .mount_device = 1, > + .mntpoint = MNTPOINT, > + .all_filesystems = 1, I do not think that this makes sense to be run for all filesystems, the listmount() syscall does not interact with any of the filesytem code at all. It just loops over a list of mount points in the namespace. > + .skip_filesystems = (const char *const []) { > + "fuse", > + NULL > + }, > +}; > > -- > 2.35.3 > > > -- > Mailing list info: https://lists.linux.it/listinfo/ltp
diff --git a/runtest/syscalls b/runtest/syscalls index cf06ee563..bce04c0cf 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -706,6 +706,8 @@ linkat02 linkat02 listen01 listen01 +listmount01 listmount01 + listxattr01 listxattr01 listxattr02 listxattr02 listxattr03 listxattr03 diff --git a/testcases/kernel/syscalls/listmount/.gitignore b/testcases/kernel/syscalls/listmount/.gitignore new file mode 100644 index 000000000..5257b298c --- /dev/null +++ b/testcases/kernel/syscalls/listmount/.gitignore @@ -0,0 +1 @@ +listmount01 diff --git a/testcases/kernel/syscalls/listmount/Makefile b/testcases/kernel/syscalls/listmount/Makefile new file mode 100644 index 000000000..8cf1b9024 --- /dev/null +++ b/testcases/kernel/syscalls/listmount/Makefile @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> + +top_srcdir ?= ../../../.. + +include $(top_srcdir)/include/mk/testcases.mk +include $(top_srcdir)/include/mk/generic_leaf_target.mk diff --git a/testcases/kernel/syscalls/listmount/listmount.h b/testcases/kernel/syscalls/listmount/listmount.h new file mode 100644 index 000000000..93766cd33 --- /dev/null +++ b/testcases/kernel/syscalls/listmount/listmount.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> + */ + +#ifndef LISTMOUNT_H + +#define _GNU_SOURCE + +#include "tst_test.h" +#include "lapi/mount.h" +#include "lapi/syscalls.h" + +static inline ssize_t listmount(uint64_t mnt_id, uint64_t last_mnt_id, + uint64_t list[], size_t num, unsigned int flags) +{ + struct mnt_id_req req = { + .size = MNT_ID_REQ_SIZE_VER0, + .mnt_id = mnt_id, + .param = last_mnt_id, + }; + + return tst_syscall(__NR_listmount, &req, list, num, flags); +} + +#endif diff --git a/testcases/kernel/syscalls/listmount/listmount01.c b/testcases/kernel/syscalls/listmount/listmount01.c new file mode 100644 index 000000000..e586c3ab3 --- /dev/null +++ b/testcases/kernel/syscalls/listmount/listmount01.c @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2024 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> + */ + +/*\ + * [Description] + * + * This test verifies that listmount() is properly recognizing a mounted + * root directory using LSMT_ROOT flag. + * + * [Algorithm] + * + * * move into a new unshared namespace + * * mount() a root inside temporary folder and get its mount ID + * * get list of mounted IDs using listmount(LSMT_ROOT, ..) + * * verify that the root mount ID is the only mount ID present inside the list + */ + +#include "listmount.h" +#include "lapi/stat.h" +#include "lapi/sched.h" + +#define MNTPOINT "mntpoint" +#define LISTSIZE 32 + +static uint64_t root_id; + +static void run(void) +{ + uint64_t list[LISTSIZE]; + + TST_EXP_POSITIVE(listmount(LSMT_ROOT, 0, list, LISTSIZE, 0)); + if (TST_RET == -1) + return; + + TST_EXP_EQ_LI(TST_RET, 1); + TST_EXP_EQ_LI(list[0], root_id); +} + +static void setup(void) +{ + struct statx sx; + + SAFE_UNSHARE(CLONE_NEWNS); + + SAFE_CHROOT(MNTPOINT); + SAFE_MOUNT("", "/", NULL, MS_REC | MS_PRIVATE, NULL); + SAFE_STATX(AT_FDCWD, "/", 0, STATX_MNT_ID_UNIQUE, &sx); + + root_id = sx.stx_mnt_id; +} + +static struct tst_test test = { + .test_all = run, + .setup = setup, + .forks_child = 1, + .min_kver = "6.8", + .mount_device = 1, + .mntpoint = MNTPOINT, + .all_filesystems = 1, + .skip_filesystems = (const char *const []) { + "fuse", + NULL + }, +};
From: Andrea Cervesato <andrea.cervesato@suse.com> This test verifies that listmount() is properly recognizing a mounted root directory using LSMT_ROOT flag. --- runtest/syscalls | 2 + testcases/kernel/syscalls/listmount/.gitignore | 1 + testcases/kernel/syscalls/listmount/Makefile | 7 +++ testcases/kernel/syscalls/listmount/listmount.h | 26 +++++++++ testcases/kernel/syscalls/listmount/listmount01.c | 66 +++++++++++++++++++++++ 5 files changed, 102 insertions(+)