From: Andrea Cervesato via ltp <ltp@lists.linux.it>
To: "Wei Gao" <wegao@suse.com>
Cc: ltp@lists.linux.it
Subject: Re: [LTP] [PATCH v9] fsconfig04: Check FSCONFIG_SET_PATH
Date: Mon, 13 Jul 2026 12:08:35 +0000 [thread overview]
Message-ID: <6a54d543.d87903e8.1f05cf.ba80@mx.google.com> (raw)
In-Reply-To: <20260626061436.15253-1-wegao@suse.com>
Hi Wei,
> The fsconfig01.c does not test if FSCONFIG_SET_PATH has any effect;
> most of the calls there just set a dummy "sync" parameter. This test
> case aims to verify if the FSCONFIG_SET_PATH operation can be used
> to dynamically change the external journal device of an ext3 or ext4
> filesystem.
>
> Closes: https://github.com/linux-test-project/ltp/issues/1169
> Signed-off-by: Wei Gao <wegao@suse.com>
> ---
> v8->v9:
> - Drop braces for single-statement inner branches
>
> runtest/syscalls | 1 +
> testcases/kernel/syscalls/fsconfig/.gitignore | 1 +
> .../kernel/syscalls/fsconfig/fsconfig04.c | 180 ++++++++++++++++++
> 3 files changed, 182 insertions(+)
> create mode 100644 testcases/kernel/syscalls/fsconfig/fsconfig04.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index a021c79da..a7a9cf638 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -422,6 +422,7 @@ fremovexattr02 fremovexattr02
> fsconfig01 fsconfig01
> fsconfig02 fsconfig02
> fsconfig03 fsconfig03
> +fsconfig04 fsconfig04
>
> fsmount01 fsmount01
> fsmount02 fsmount02
> diff --git a/testcases/kernel/syscalls/fsconfig/.gitignore b/testcases/kernel/syscalls/fsconfig/.gitignore
> index cfedae5f7..bd3754c34 100644
> --- a/testcases/kernel/syscalls/fsconfig/.gitignore
> +++ b/testcases/kernel/syscalls/fsconfig/.gitignore
> @@ -1,3 +1,4 @@
> /fsconfig01
> /fsconfig02
> /fsconfig03
> +/fsconfig04
> diff --git a/testcases/kernel/syscalls/fsconfig/fsconfig04.c b/testcases/kernel/syscalls/fsconfig/fsconfig04.c
> new file mode 100644
> index 000000000..ce6c8fd01
> --- /dev/null
> +++ b/testcases/kernel/syscalls/fsconfig/fsconfig04.c
> @@ -0,0 +1,180 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2026 Wei Gao <wegao@suse.com>
> + */
> +
> +/*\
> + * This test aims to validate :manpage:`fsconfig(2)` with the
> + * FSCONFIG_SET_PATH operation in dynamically altering the external
> + * journal device of an ext3 or ext4 filesystem. Case acquires three
> + * loop devices (dev0, dev1, dev2), it formats dev1 and dev2 as
> + * external journal devices using the -O journal_dev option and assigns
> + * them the same UUID. Then formats dev0 (the main filesystem) multiple
> + * times, first associating it with dev1, then change to dev2, finally
> + * back to dev1 again as an external journal using the -J device= option.
This is not a description but the Description + Algorithm section. Please
split them so we understand what the test aims for + algorithm that is used.
> + *
> + * 2 Implementation notes in this case need mention:
> + *
> + * - To avoid "journal UUID does not match" error when switch external journal device
> + * we have to assign same UUID to dev1/dev2
> + * - Before fsconfig test we have to format dev0 associating to dev1->dev2->dev1,
> + * this will make sure both dev1/2's super block contain correct content. Otherwise
> + * you will encounter error such as "EXT4-fs (loop0): External journal has more than
> + * one user (unsupported) - 0" when switch external journal device using fsconfig.
> + */
> +
> +#include "tst_test.h"
> +#include "tst_safe_stdio.h"
> +#include "lapi/fsmount.h"
> +
> +#define MNTPOINT "mntpoint"
> +#define LOOP_DEV_SIZE 10
> +#define UUID "d73c9e5e-97e4-4a9c-b17e-75a931b02660"
> +
> +static int fd = -1;
> +static char dev0[PATH_MAX];
> +static char dev1[PATH_MAX];
> +static char dev2[PATH_MAX];
> +
> +static void cleanup(void)
> +{
> + if (fd != -1)
> + SAFE_CLOSE(fd);
> +
> + if (dev1[0])
> + tst_detach_device(dev1);
> +
> + if (dev2[0])
> + tst_detach_device(dev2);
> +}
> +
> +static void setup(void)
> +{
> + fsopen_supported_by_kernel();
> +
> + strcpy(dev0, tst_device->dev);
> +
> + if (tst_prealloc_file("dev1_file", 1024 * 1024, LOOP_DEV_SIZE))
> + tst_brk(TBROK, "Failed to create dev1_file");
> +
> + if (tst_find_free_loopdev(dev1, sizeof(dev1)) == -1)
> + tst_brk(TBROK, "No free loop device found for dev1");
> +
> + if (tst_attach_device(dev1, "dev1_file"))
> + tst_brk(TBROK, "Failed to attach dev1_file to %s", dev1);
> +
> + if (tst_prealloc_file("dev2_file", 1024 * 1024, LOOP_DEV_SIZE))
> + tst_brk(TBROK, "Failed to create dev2_file");
> +
> + if (tst_find_free_loopdev(dev2, sizeof(dev2)) == -1)
> + tst_brk(TBROK, "No free loop device found for dev2");
> +
> + if (tst_attach_device(dev2, "dev2_file"))
> + tst_brk(TBROK, "Failed to attach dev2_file to %s", dev2);
This code is duplicated. We should create a helper that prealloc
and attach the device.
> +
> + const char *const *mkfs_opts_set_UUID;
> + const char *const *mkfs_opts_set_journal_dev1;
> + const char *const *mkfs_opts_set_journal_dev2;
> +
> + mkfs_opts_set_UUID = (const char *const []) {"-F", "-U", UUID,
> + "-O", "journal_dev", NULL};
> +
> + char device_option_dev1[PATH_MAX];
> + char device_option_dev2[PATH_MAX];
> +
> + snprintf(device_option_dev1, sizeof(device_option_dev1), "device=%s", dev1);
> + snprintf(device_option_dev2, sizeof(device_option_dev2), "device=%s", dev2);
> +
> + mkfs_opts_set_journal_dev1 = (const char *const []) {"-F", "-J",
> + device_option_dev1, NULL};
> +
> + mkfs_opts_set_journal_dev2 = (const char *const []) {"-F", "-J",
> + device_option_dev2, NULL};
> +
> + SAFE_MKFS(dev1, tst_device->fs_type, mkfs_opts_set_UUID, NULL);
> + SAFE_MKFS(dev2, tst_device->fs_type, mkfs_opts_set_UUID, NULL);
> + SAFE_MKFS(dev0, tst_device->fs_type, mkfs_opts_set_journal_dev1, NULL);
> + SAFE_MKFS(dev0, tst_device->fs_type, mkfs_opts_set_journal_dev2, NULL);
> + SAFE_MKFS(dev0, tst_device->fs_type, mkfs_opts_set_journal_dev1, NULL);
> +}
> +
> +static void run(void)
> +{
> + TEST(fd = fsopen(tst_device->fs_type, 0));
> + if (fd == -1)
> + tst_brk(TBROK | TTERRNO, "fsopen() failed");
> +
> + TEST(fsconfig(fd, FSCONFIG_SET_STRING, "source", dev0, 0));
> + if (TST_RET == -1)
> + tst_brk(TBROK | TTERRNO, "fsconfig(FSCONFIG_SET_STRING) failed");
> +
> + TEST(fsconfig(fd, FSCONFIG_SET_PATH, "journal_path", dev2, 0));
> + if (TST_RET == -1) {
> + if (TST_ERR == EOPNOTSUPP)
> + tst_res(TCONF, "fsconfig(FSCONFIG_SET_PATH) not supported");
> + else
> + tst_res(TFAIL | TTERRNO, "fsconfig(FSCONFIG_SET_PATH) failed");
> + SAFE_CLOSE(fd);
> + return;
> + }
> +
> + TEST(fsconfig(fd, FSCONFIG_CMD_CREATE, NULL, NULL, 0));
> + if (TST_RET == -1) {
> + tst_res(TFAIL | TTERRNO, "fsconfig(FSCONFIG_CMD_CREATE) failed");
> + SAFE_CLOSE(fd);
> + return;
> + }
> +
> + char loop_name[NAME_MAX];
> + char path[PATH_MAX];
> + char device_str[NAME_MAX];
> + unsigned int major, minor, device_num;
> + unsigned int found = 0;
> +
> + SAFE_SSCANF(dev2, "/dev/%s", loop_name);
> +
> + snprintf(path, sizeof(path), "/sys/block/%s/dev", loop_name);
> + SAFE_FILE_SCANF(path, "%u:%u", &major, &minor);
> + device_num = (minor & 0xff) | (major << 8) | ((minor & ~0xff) << 12);
> + snprintf(device_str, sizeof(device_str), "0x%04x", device_num);
> +
> + char line[PATH_MAX];
> + FILE *tune2fs;
> +
> + snprintf(path, sizeof(path), "tune2fs -l %s 2>&1", dev0);
> + tune2fs = SAFE_POPEN(path, "r");
> +
> + while (fgets(line, PATH_MAX, tune2fs)) {
> + if (*line && strstr(line, "Journal device:") && strstr(line, device_str)) {
> + found = 1;
> + break;
> + }
> + }
> +
> + if (found == 1)
> + tst_res(TPASS, "Device found in journal");
> + else
> + tst_res(TFAIL, "Device not found in journal");
> +
> + pclose(tune2fs);
> + SAFE_CLOSE(fd);
> +}
> +
> +static struct tst_test test = {
> + .test_all = run,
> + .setup = setup,
> + .cleanup = cleanup,
> + .needs_root = 1,
> + .needs_tmpdir = 1,
> + .format_device = 1,
we already format the device manually.
> + .mntpoint = MNTPOINT,
> + .needs_cmds = (struct tst_cmd []) {
> + {.cmd = "tune2fs"},
> + {}
> + },
> + .filesystems = (struct tst_fs []) {
> + {.type = "ext3"},
> + {.type = "ext4"},
> + {}
> + },
> +};
> --
> 2.54.0
>
--
Andrea Cervesato
SUSE QE Automation Engineer Linux
andrea.cervesato@suse.com
--
Mailing list info: https://lists.linux.it/listinfo/ltp
prev parent reply other threads:[~2026-07-13 12:09 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-16 15:10 [LTP] [PATCH v1] fsconfig04.c: Check FSCONFIG_SET_PATH Wei Gao via ltp
2025-05-22 20:56 ` Petr Vorel
2025-05-26 14:29 ` Wei Gao via ltp
2025-05-26 6:40 ` Petr Vorel
2025-05-26 14:35 ` [LTP] [PATCH v2] " Wei Gao via ltp
2025-05-26 9:54 ` Petr Vorel
2025-05-26 12:54 ` Cyril Hrubis
2025-05-26 16:13 ` Petr Vorel
2025-05-27 8:24 ` Cyril Hrubis
2025-05-27 8:58 ` [LTP] LTP doc: test examples [was: Re: [PATCH v2] fsconfig04.c: Check FSCONFIG_SET_PATH] Petr Vorel
2025-05-26 14:38 ` [LTP] [PATCH v2] fsconfig04.c: Check FSCONFIG_SET_PATH Cyril Hrubis
2025-06-03 21:45 ` [LTP] [PATCH v3] " Wei Gao via ltp
2025-10-17 4:39 ` Wei Gao via ltp
2025-12-12 9:29 ` Andrea Cervesato via ltp
2026-02-25 9:27 ` Wei Gao via ltp
2026-03-16 8:49 ` Petr Vorel
2026-03-17 0:59 ` Wei Gao via ltp
2026-03-24 12:50 ` Petr Vorel
2026-04-10 5:47 ` [LTP] [PATCH v4] " Wei Gao via ltp
2026-04-16 11:25 ` [LTP] [PATCH v5] fsconfig04: " Wei Gao via ltp
2026-04-16 13:52 ` [LTP] " linuxtestproject.agent
2026-04-16 13:55 ` Andrea Cervesato via ltp
2026-04-30 5:19 ` [LTP] [PATCH v6] " Wei Gao via ltp
2026-04-30 6:34 ` [LTP] " linuxtestproject.agent
2026-05-07 12:25 ` Wei Gao via ltp
2026-06-09 9:44 ` [LTP] [PATCH v6] " Andrea Cervesato via ltp
2026-06-10 5:21 ` [LTP] [PATCH v7] " Wei Gao via ltp
2026-06-10 10:06 ` [LTP] " linuxtestproject.agent
2026-06-18 2:38 ` [LTP] [PATCH v8] " Wei Gao via ltp
2026-06-18 4:04 ` [LTP] " linuxtestproject.agent
2026-06-26 6:14 ` [LTP] [PATCH v9] " Wei Gao via ltp
2026-06-26 9:33 ` [LTP] " linuxtestproject.agent
2026-07-13 12:08 ` Andrea Cervesato via ltp [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=6a54d543.d87903e8.1f05cf.ba80@mx.google.com \
--to=ltp@lists.linux.it \
--cc=andrea.cervesato@suse.com \
--cc=wegao@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.