[PATCH -next 1/2] selftests/mincore: Add checking of block dev for TEST(check_file_mmap)

From: Zhao Gongyi
Date: Fri Oct 21 2022 - 03:14:35 EST


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