TEST(check_file_mmap) will fail when we run the test on tmpfs and report: mincore_selftest.c:261:check_file_mmap:Expected ra_pages (0) > 0 (0) mincore_selftest.c:262:check_file_mmap:No read-ahead pages found in memory For some embaded system, maybe there is only tmpfs file system exist, run the test will fail, or we install the test on a filesystem that has no backend, also it will fail as unepected. So add a checking of block dev for the filesystem at first. Signed-off-by: Zhao Gongyi <zhaogongyi@xxxxxxxxxx> --- .../selftests/mincore/mincore_selftest.c | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tools/testing/selftests/mincore/mincore_selftest.c b/tools/testing/selftests/mincore/mincore_selftest.c index 4c88238fc8f0..287351a599a2 100644 --- a/tools/testing/selftests/mincore/mincore_selftest.c +++ b/tools/testing/selftests/mincore/mincore_selftest.c @@ -14,6 +14,9 @@ #include <sys/mman.h> #include <string.h> #include <fcntl.h> +#include <mntent.h> +#include <sys/stat.h> +#include <linux/fs.h> #include "../kselftest.h" #include "../kselftest_harness.h" @@ -173,6 +176,43 @@ TEST(check_huge_pages) munmap(addr, page_size); } +static struct mntent* find_mount_point(const char *name) +{ + struct stat s; + FILE *mtab_fp; + struct mntent *mountEntry; + dev_t devno_of_name; + + if (stat(name, &s) != 0) + return NULL; + + devno_of_name = s.st_dev; + + mtab_fp = setmntent("/proc/mounts", "r"); + if (!mtab_fp) + return NULL; + + while ((mountEntry = getmntent(mtab_fp)) != NULL) { + if (strcmp(name, mountEntry->mnt_dir) == 0 + || strcmp(name, mountEntry->mnt_fsname) == 0) { + break; + } + + if (mountEntry->mnt_fsname[0] == '/' + && stat(mountEntry->mnt_fsname, &s) == 0 + && s.st_rdev == devno_of_name) { + break; + } + + if (stat(mountEntry->mnt_dir, &s) == 0 + && s.st_dev == devno_of_name) { + break; + } + } + endmntent(mtab_fp); + + return mountEntry; +} /* * Test mincore() behavior on a file-backed page. @@ -194,6 +234,19 @@ TEST(check_file_mmap) int fd; int i; int ra_pages = 0; + struct stat s; + struct mntent *mount_entry; + + mount_entry = find_mount_point("."); + ASSERT_NE(NULL, mount_entry) { + TH_LOG("Find mount point of '.' failed"); + } + + ASSERT_EQ(0, (stat(mount_entry->mnt_fsname, &s) != 0 + || !S_ISBLK(s.st_mode))) { + TH_LOG("There is no a block dev on mount point, " + "test is not supported"); + } page_size = sysconf(_SC_PAGESIZE); vec_size = FILE_SIZE / page_size; -- 2.17.1