[LTP] [PATCH v4] syscalls/newmount: new test case for new mount API

Petr Vorel pvorel@suse.cz
Fri Jan 17 08:48:28 CET 2020


Hi,

...
> Yeah.. Although this case uses fsmount(), my later cases about new mount API
> might not use it. I don't like the name "newmount0*" either, but I don't have
> a better one for now. If anyone has a better name, please feel free to tell
> me :)
I slightly prefer fsmount01.c as it's based on real name, but no strong opinion.

> > Also this will likely fail on older kernels that does not support the
> > syscall. I guess that you will get einval here if the fsopen() is not
> > implemented in kernel. You have to at least set the min_kver in the
> > tst_test structure so that the test is skipped on older kernels.

> If an older downstream kernel (e.g. rhel8/centos kernel-4.18.0-xxx.el8)
> merges new mount API features, this case will think the kernel version
> is too low to do this test.

> I just tested on an old kernel which doesn't support new mount feature.
> Then I get this:

>   ...
>   ...
>   tst_test.c:1278: INFO: Testing on xfs
>   tst_mkfs.c:90: INFO: Formatting /dev/loop1 with xfs opts='' extra opts=''
>   tst_test.c:1217: INFO: Timeout per run is 0h 05m 00s
>   ../../../../include/lapi/newmount.h:18: CONF: syscall(430) __NR_fsopen not supported

> I think it's fine, due to generally we ignore CONF. What do you think?

I tested it on several distros (old and new kernels) with fixed issues (all but
rename, see following diff) and confirm it TCONF on older kernels
../../../../include/lapi/newmount.h:18: CONF: syscall(430) __NR_fsopen not supported

The only thing with bothers me is is that NTFS related failure
on CONFIG_NTFS_FS is not set and mkfs.ntfs installed.
I'd prefer at least to have a warning, but but better to fix it.
I guess it's LTP problem, see code at safe_mount() in lib/safe_macros.c

	/*
	 * Don't try using the kernel's NTFS driver when mounting NTFS, since
	 * the kernel's NTFS driver doesn't have proper write support.
	 */
	if (!filesystemtype || strcmp(filesystemtype, "ntfs")) {
		rval = mount(source, target, filesystemtype, mountflags, data);
		if (!rval)
			return 0;
	}

But obviously we don't use it as we do mount in the test, not in the library.
So I propose (and can implement) to add flag TST_FS_SKIP_NTFS 0x02 into include/tst_fs.h
and use it in test.

Kind regards,
Petr

diff --git configure.ac configure.ac
index 28f840c51..02d5b8c87 100644
--- configure.ac
+++ configure.ac
@@ -71,12 +71,16 @@ AC_CHECK_FUNCS([ \
     execveat \
     fallocate \
     fchownat \
+    fsconfig \
+    fsmount \
+    fsopen \
     fstatat \
     getdents \
     getdents64 \
     kcmp \
     mkdirat \
     mknodat \
+    move_mount \
     name_to_handle_at \
     openat \
     pidfd_send_signal \
@@ -229,7 +233,6 @@ LTP_CHECK_MADVISE
 LTP_CHECK_MKDTEMP
 LTP_CHECK_MMSGHDR
 LTP_CHECK_MREMAP_FIXED
-LTP_CHECK_NEWMOUNT
 LTP_CHECK_NOMMU_LINUX
 LTP_CHECK_PERF_EVENT
 LTP_CHECK_PRCTL_SUPPORT
diff --git m4/ltp-newmount.m4 m4/ltp-newmount.m4
deleted file mode 100644
index e13a6f0b1..000000000
--- m4/ltp-newmount.m4
+++ /dev/null
@@ -1,10 +0,0 @@
-dnl SPDX-License-Identifier: GPL-2.0-or-later
-dnl Copyright (C) 2019 Red Hat, Inc. All Rights Reserved.
-
-AC_DEFUN([LTP_CHECK_NEWMOUNT],[
-AC_CHECK_FUNCS(fsopen,,)
-AC_CHECK_FUNCS(fsconfig,,)
-AC_CHECK_FUNCS(fsmount,,)
-AC_CHECK_FUNCS(move_mount,,)
-AC_CHECK_HEADER(sys/mount.h,,,)
-])
diff --git testcases/kernel/syscalls/newmount/newmount01.c testcases/kernel/syscalls/newmount/newmount01.c
index 1e1ff4a78..4fe6b350c 100644
--- testcases/kernel/syscalls/newmount/newmount01.c
+++ testcases/kernel/syscalls/newmount/newmount01.c
@@ -28,7 +28,7 @@ static int ismount(char *mntpoint)
 
 	file = fopen("/proc/mounts", "r");
 	if (file == NULL)
-		tst_brk(TFAIL | TTERRNO, "Open /proc/mounts failed");
+		tst_brk(TBROK | TTERRNO, "Open /proc/mounts failed");
 
 	while (fgets(line, LINELENGTH, file) != NULL) {
 		if (strstr(line, mntpoint) != NULL) {
@@ -45,7 +45,7 @@ static void cleanup(void)
 	if (is_mounted) {
 		TEST(tst_umount(MNTPOINT));
 		if (TST_RET != 0)
-			tst_brk(TFAIL | TTERRNO, "umount failed in cleanup");
+			tst_brk(TBROK | TTERRNO, "umount failed in cleanup");
 	}
 }
 
@@ -53,7 +53,7 @@ static void test_newmount(void)
 {
 	TEST(fsopen(tst_device->fs_type, FSOPEN_CLOEXEC));
 	if (TST_RET < 0) {
-		tst_brk(TFAIL | TTERRNO,
+		tst_brk(TBROK | TTERRNO,
 		        "fsopen %s", tst_device->fs_type);
 	}
 	sfd = TST_RET;
@@ -61,7 +61,7 @@ static void test_newmount(void)
 
 	TEST(fsconfig(sfd, FSCONFIG_SET_STRING, "source", tst_device->dev, 0));
 	if (TST_RET < 0) {
-		tst_brk(TFAIL | TTERRNO,
+		tst_brk(TBROK | TTERRNO,
 		        "fsconfig set source to %s", tst_device->dev);
 	}
 	tst_res(TPASS, "fsconfig set source to %s", tst_device->dev);
@@ -69,14 +69,14 @@ static void test_newmount(void)
 
 	TEST(fsconfig(sfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0));
 	if (TST_RET < 0) {
-		tst_brk(TFAIL | TTERRNO,
+		tst_brk(TBROK | TTERRNO,
 		        "fsconfig create superblock");
 	}
 	tst_res(TPASS, "fsconfig create superblock");
 
 	TEST(fsmount(sfd, FSMOUNT_CLOEXEC, 0));
 	if (TST_RET < 0) {
-		tst_brk(TFAIL | TTERRNO, "fsmount");
+		tst_brk(TBROK | TTERRNO, "fsmount");
 	}
 	mfd = TST_RET;
 	tst_res(TPASS, "fsmount");
@@ -84,7 +84,7 @@ static void test_newmount(void)
 
 	TEST(move_mount(mfd, "", AT_FDCWD, MNTPOINT, MOVE_MOUNT_F_EMPTY_PATH));
 	if (TST_RET < 0) {
-		tst_brk(TFAIL | TTERRNO, "move_mount attach to mount point");
+		tst_brk(TBROK | TTERRNO, "move_mount attach to mount point");
 	}
 	is_mounted = 1;
 	tst_res(TPASS, "move_mount attach to mount point");
@@ -94,7 +94,7 @@ static void test_newmount(void)
 		tst_res(TPASS, "new mount works");
 		TEST(tst_umount(MNTPOINT));
 		if (TST_RET != 0)
-			tst_brk(TFAIL | TTERRNO, "umount failed");
+			tst_brk(TBROK | TTERRNO, "umount failed");
 		is_mounted = 0;
 	} else {
 		tst_res(TFAIL, "new mount fails");
@@ -108,5 +108,4 @@ static struct tst_test test = {
 	.mntpoint	= MNTPOINT,
 	.format_device	= 1,
 	.all_filesystems = 1,
-	.dev_fs_flags	= TST_FS_SKIP_FUSE,
 };


More information about the ltp mailing list