diff mbox series

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

Message ID 20221021071052.143393-1-zhaogongyi@huawei.com (mailing list archive)
State New
Headers show
Series [-next,1/2] selftests/mincore: Add checking of block dev for TEST(check_file_mmap) | expand

Commit Message

Zhao Gongyi Oct. 21, 2022, 7:10 a.m. UTC
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@huawei.com>
---
 .../selftests/mincore/mincore_selftest.c      | 53 +++++++++++++++++++
 1 file changed, 53 insertions(+)

--
2.17.1
diff mbox series

Patch

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;