[LTP] [PATCH v1] tst_filesystems01.c: Add test for .filesystems
Petr Vorel
pvorel@suse.cz
Tue Sep 16 13:02:48 CEST 2025
Hi Wei, Cyril,
Cyril, single note below can wait after the release.
Also, please have look if this fulfils your idea about testing the feature.
> Fixes: https://github.com/linux-test-project/ltp/issues/1243
> Signed-off-by: Wei Gao <wegao@suse.com>
> ---
> lib/newlib_tests/tst_filesystems01.c | 118 +++++++++++++++++++++++++++
> 1 file changed, 118 insertions(+)
> create mode 100644 lib/newlib_tests/tst_filesystems01.c
The test is running fine on github, please add it to
lib/newlib_tests/runtest.sh.
+++ lib/newlib_tests/runtest.sh
@@ -24,6 +24,7 @@ tst_checkpoint_wait_timeout
tst_checkpoint_wake_timeout
tst_device
tst_expiration_timer
+tst_filesystems01
tst_fuzzy_sync0[1-3]
tst_needs_cmds0[1-36-8]
tst_res_hexd
...
> + snprintf(str_size, sizeof(str_size), "%u", size);
> + snprintf(path, sizeof(path), "tune2fs -l %s 2>&1", tst_device->dev);
> + tune2fs = SAFE_POPEN(path, "r");
> + if (tune2fs == NULL)
> + tst_brk(TBROK, "Can not popen %s", path);
The point of SAFE_* functions/macros is to avoid having to check in the tests :).
Please remove these 2 lines.
> + while (fgets(line, PATH_MAX, tune2fs)) {
> + if (*line && strstr(line, "Inode size:") && strstr(line, str_size)) {
Common patter for fgets() is to check for != NULL, then you don't need "*line &&":
while (fgets(line, PATH_MAX, tune2fs) != NULL) {
if (strstr(line, "Inode size:") && strstr(line, str_size)) {
> + tst_res(TPASS, "check inode size pass");
> + return 0;
> + }
> + }
> +
> + pclose(tune2fs);
> + tst_res(TFAIL, "check inode size failed");
> + return -1;
> +}
> +
> +static int check_mnt_data(char *opt)
> +{
> + FILE *fp;
> + char line[PATH_MAX];
> +
> + fp = SAFE_FOPEN("/proc/mounts", "r");
> + if (fp == NULL)
> + tst_brk(TBROK, "Can not open /proc/mounts");
Also here.
> + while (fgets(line, PATH_MAX, fp)) {
> + if (*line && strstr(line, tst_device->dev) && strstr(line, opt)) {
Also here.
> + tst_res(TPASS, "check mnt data pass");
> + return 0;
> + }
> + }
> + SAFE_FCLOSE(fp);
> + tst_res(TFAIL, "check mnt data failed");
> + return -1;
> +}
> +
> +static int check_mkfs_size_opt(unsigned int size)
> +{
> + char path[PATH_MAX];
> + char line[PATH_MAX];
> + FILE *dumpe2fs;
> + char str_size[NAME_MAX];
> +
> + snprintf(str_size, sizeof(str_size), "%u", size);
> + snprintf(path, sizeof(path), "dumpe2fs -h %s 2>&1", tst_device->dev);
> + dumpe2fs = SAFE_POPEN(path, "r");
> + if (dumpe2fs == NULL)
> + tst_brk(TBROK, "Can not popen %s", path);
And here.
> +
> + while (fgets(line, PATH_MAX, dumpe2fs)) {
> + if (*line && strstr(line, "Block count:") && strstr(line, str_size)) {
And here.
> + tst_res(TPASS, "check mkfs size opt pass");
> + return 0;
> + }
> + }
> +
> + pclose(dumpe2fs);
> + tst_res(TFAIL, "check mkfs size opt failed");
> + return -1;
> +}
> +
> +static void do_test(void)
> +{
> + long fs_type;
> +
> + fs_type = tst_fs_type(MOUNT_POINT);
> +
> + if (fs_type == TST_EXT234_MAGIC) {
> + check_inode_size(128);
check_inode_size() and the other 2 test functions return int but you don't use
the return value. Either use it or change return type to void.
> + check_mkfs_size_opt(10240);
> + }
> +
> + if (fs_type == TST_XFS_MAGIC)
> + check_mnt_data("usrquota");
While this works, it expect that nobody changes .filesystems below.
@Cyril: wouldn't be useful if the test itself had it's struct tst_fs member
from filesystems[i] available? Static variable, either pointer to the member or
instance of i from run_tcases_per_fs()?
Because we always expect filesystems (.type) is unique in .filesystems. But in
the future we might have test which uses several items in .filesystems with a
different data but an unique filesystem (not needed so far).
Kind regards,
Petr
> +}
> +
> +static struct tst_test test = {
> + .test_all = do_test,
> + .needs_root = 1,
> + .mntpoint = MOUNT_POINT,
> + .mount_device = 1,
> + .needs_cmds = (const char *[]) {
> + "tune2fs",
> + "dumpe2fs",
> + NULL
> + },
> + .filesystems = (struct tst_fs []) {
> + {
> + .type = "ext3",
> + .mkfs_opts = (const char *const []){"-I", "128", NULL},
> + .mkfs_size_opt = "10240",
> + },
> + {
> + .type = "xfs",
> + .mnt_data = "usrquota",
> + },
> + {}
> + },
> +
> +};
More information about the ltp
mailing list