[LTP] [PATCH v3 2/5] lib: Add support for max_kver to struct tst_test and tst_fs
Petr Vorel
pvorel@suse.cz
Fri Jul 31 12:51:29 CEST 2026
max_kver adds a support to require a maximal kernel version the test can
run on. e.g. "7.2" (mainline release) or "6.1.180" (stable release).
NOTE: Mainline release is sufficient on any stable release (test with
.min_kver = "7.1" runs also on kernel 7.1.5). Stable releases are
compared as expected.
Signed-off-by: Petr Vorel <pvorel@suse.cz>
---
Changes v2->v3:
* Allow to pass mainline release (e.g. max_version = "7.1") on any stable
release (e.g. 7.1.5). Stable releases (e.g. 7.1.5) are compared as
expected. For this I'd like an explicit ack.
include/tst_test.h | 13 ++++++++++++-
lib/tst_test.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 59 insertions(+), 1 deletion(-)
diff --git a/include/tst_test.h b/include/tst_test.h
index c69362485e..318b2f79b7 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -280,6 +280,9 @@ struct tst_ulimit_val {
*
* @min_kver: A minimum kernel version supporting the filesystem which has been
* created with mkfs.
+ *
+ * @max_kver: A maximum kernel version supporting the filesystem which has been
+ * created with mkfs.
*/
struct tst_fs {
const char *type;
@@ -292,6 +295,7 @@ struct tst_fs {
const void *mnt_data;
const char *min_kver;
+ const char *max_kver;
};
/**
@@ -301,7 +305,13 @@ struct tst_fs {
* and each time passed an increasing counter value.
* @options: An NULL optstr terminated array of struct tst_option.
*
- * @min_kver: A minimal kernel version the test can run on. e.g. "3.10".
+ * @min_kver: A minimal kernel version the test can run on. e.g. "4.4" (mainline
+ * release) or "6.1.180" (stable release).
+ *
+ * @max_kver: A maximal kernel version the test can run on. e.g. "7.2" (mainline
+ * release) or "6.1.180" (stable release). NOTE: Mainline release is sufficient
+ * on any stable release (test with ``min_kver = "7.1"`` runs also on kernel
+ * 7.1.5). Stable releases are compared as expected.
*
* @supported_archs: A NULL terminated array of architectures the test runs on
* e.g. {"x86_64, "x86", NULL}. Calls tst_is_on_arch() to
@@ -551,6 +561,7 @@ struct tst_fs {
struct tst_option *options;
const char *min_kver;
+ const char *max_kver;
const char *const *supported_archs;
diff --git a/lib/tst_test.c b/lib/tst_test.c
index 778a1fed40..8b9abe716a 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -1087,6 +1087,44 @@ static bool check_min_kver(const char *min_kver, const int brk_nosupp)
return true;
}
+/*
+ * Check for the maximal required kernel version.
+ *
+ * return: true if the kernel version is low enough, false otherwise.
+ */
+static bool check_max_kver(const char *max_kver, const int brk_nosupp)
+{
+ char *msg;
+ int dots, i, v1, v2, v3;
+
+ if (tst_parse_kver(max_kver, &v1, &v2, &v3)) {
+ tst_res(TWARN,
+ "Invalid kernel version %s, expected %%d.%%d.%%d",
+ max_kver);
+ }
+
+ for (i=0, dots=0; max_kver[i]; i++)
+ dots += (max_kver[i] == '.');
+
+ /*
+ * For mainline kernel release without patch level (single dot e.g. "7.1")
+ * ignore v3 (the sublevel): 7.1.x is always ok.
+ * Do *not* ignore v3 on stable kernel release (2 dots, e.g. 7.1.5).
+ */
+ if (tst_kvercmp(v1, v2, v3) > (dots == 1 ? 1023 : 0)) {
+ msg = "The test requires kernel %s or older";
+
+ if (brk_nosupp)
+ tst_brk(TCONF, msg, max_kver);
+ else
+ tst_res(TCONF, msg, max_kver);
+
+ return false;
+ }
+
+ return true;
+}
+
/*
* Checks if the struct results values are equal.
*
@@ -1463,6 +1501,9 @@ static void do_setup(int argc, char *argv[])
if (tst_test->min_kver)
check_min_kver(tst_test->min_kver, 1);
+ if (tst_test->max_kver)
+ check_max_kver(tst_test->max_kver, 1);
+
if (tst_test->skip_in_lockdown && tst_lockdown_enabled() > 0)
tst_brk(TCONF, "Kernel is locked down, skipping test");
@@ -1586,6 +1627,9 @@ static void do_setup(int argc, char *argv[])
if (tst_test->filesystems && tst_test->filesystems->min_kver)
check_min_kver(tst_test->filesystems->min_kver, 1);
+ if (tst_test->filesystems && tst_test->filesystems->max_kver)
+ check_max_kver(tst_test->filesystems->max_kver, 1);
+
prepare_device(tst_test->filesystems);
}
}
@@ -1991,6 +2035,9 @@ static void run_tcase_on_fs(struct tst_fs *fs, const char *fs_type)
if (fs->min_kver && !check_min_kver(fs->min_kver, 0))
return;
+ if (fs->max_kver && !check_max_kver(fs->max_kver, 0))
+ return;
+
prepare_device(fs);
fork_testrun();
--
2.55.0
More information about the ltp
mailing list