[LTP] [PATCH] lib/tst_supported_fs_types.c: Add tmpfs to filesystem whitelist

zhaogongyi zhaogongyi@huawei.com
Sat Feb 27 10:33:48 CET 2021


Hi Cyril,

> 
> But there is another problem there, since the code still mounts tmpfs on
> tmpdir for a short while, which is temporary directory used by all LTP tests,
> which may potentially break tests that runs in parallel.

	In general, when all_filesystems has been set to 1,  the needs_tmpdir would be set to 1 and the mntpoint must has been set to some path, so the test run in /tmp/tmpxxxxxx/mntpoint and
	other LTP tests would run in another tmpdir. So it has no problem for running in parallel.

	I don't know if I understand it right.
> 
> So we will have to prepare a temporary directory with mkdtemp() under
> the tmpdir as well and pass that to the mount() syscall instead.
>

Thanks so much!

-------------------------------------------------------------------------------------------------------
> 
> Hi!
> > diff --git a/lib/tst_supported_fs_types.c
> > b/lib/tst_supported_fs_types.c index 00ede549d..696b6731e 100644
> > --- a/lib/tst_supported_fs_types.c
> > +++ b/lib/tst_supported_fs_types.c
> > @@ -22,6 +22,7 @@ static const char *const fs_type_whitelist[] = {
> >  	"vfat",
> >  	"exfat",
> >  	"ntfs",
> > +	"tmpfs",
> >  	NULL
> >  };
> >
> > @@ -34,6 +35,10 @@ static int has_mkfs(const char *fs_type)
> >
> >  	sprintf(buf, "mkfs.%s >/dev/null 2>&1", fs_type);
> >
> > +	if (strstr(buf, "mkfs.tmpfs")) {
> > +		return 1;
> > +	}
> > +
> >  	ret = tst_system(buf);
> >
> >  	if (WEXITSTATUS(ret) == 127) {
> > @@ -55,8 +60,8 @@ static int has_kernel_support(const char *fs_type,
> int flags)
> >  	if (!tmpdir)
> >  		tmpdir = "/tmp";
> >
> > -	mount("/dev/zero", tmpdir, fs_type, 0, NULL);
> > -	if (errno != ENODEV) {
> > +	ret = mount("/dev/zero", tmpdir, fs_type, 0, NULL);
> 
> The manual page explicitly says that errno is set to ENODEV if filesystem is
> not supported by kernel. So the check for errno should stay, since the
> statement above will fail to mount any real filesystem since we pass
> "/dev/zero" instead of valid filesystem image there.
> 
> I.e. if we pass a real filesystem there it will either fail with EINVAL (since
> /dev/zero does not have a valid superblock) or ENODEV if there is no
> kernel driver for the filesystem.
> 
> > +	if (!ret) {
> 
> I guess that tmpfs succeeds to mount there. So I guess that we should
> change the condition to:
> 
> 	if ((ret && errno != ENODEV) || !ret) {
> 		if (!ret)
> 			tst_umount(tmpdir);
> 
> 		tst_res(TINFO, "Kernel supports %s", fs_type);
> 		return 1;
> 	}
> 
> 
> But there is another problem there, since the code still mounts tmpfs on
> tmpdir for a short while, which is temporary directory used by all LTP tests,
> which may potentially break tests that runs in parallel.
> 
> So we will have to prepare a temporary directory with mkdtemp() under
> the tmpdir as well and pass that to the mount() syscall instead.
> 
> --
> Cyril Hrubis
> chrubis@suse.cz


More information about the ltp mailing list