[LTP] [PATCH v2] fanotify13: fix test failure when running iterations
Amir Goldstein
amir73il@gmail.com
Wed Jun 3 12:24:04 CEST 2026
On Wed, Jun 3, 2026 at 3:58 AM AnonymeMeow <anonymemeow@gmail.com> wrote:
>
> The FAN_DELETE_SELF test case removes test files, causing later
> iterations to crash. Recreate the removed files after the test to
> restore the expected initial state. And adjust the overlayfs mount
> timing to avoid creating files directly in the filesystem underneath
> the already mounted overlayfs.
>
> Signed-off-by: AnonymeMeow <anonymemeow@gmail.com>
> ---
>
> Hi, Amir,
>
> I tested your suggested solution, but the overlayfs mount failed with:
>
> fanotify13.c:165: TBROK: overlayfs mount failed: ESTALE (116)
>
> So I kept clean_upper_dir() in restore_objects() to restore the expected
> initial state.
Ok no problem. This is fine too.
Thanks,
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
>
> With Best Regards,
> AnonymeMeow
>
> ---
> .../kernel/syscalls/fanotify/fanotify13.c | 49 ++++++++++++++++---
> 1 file changed, 43 insertions(+), 6 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/fanotify/fanotify13.c b/testcases/kernel/syscalls/fanotify/fanotify13.c
> index 76d40eaf7..182858470 100644
> --- a/testcases/kernel/syscalls/fanotify/fanotify13.c
> +++ b/testcases/kernel/syscalls/fanotify/fanotify13.c
> @@ -53,6 +53,9 @@
> #define FILE_PATH_ONE MOUNT_PATH"/"FILE_ONE
> #define FILE_PATH_TWO MOUNT_PATH"/"FILE_TWO
>
> +#define TST_VARIANT_OVL_LOWER (tst_variant & 1)
> +#define TST_VARIANT_OVL_WATCH (tst_variant > 2)
> +
> #if defined(HAVE_NAME_TO_HANDLE_AT)
> struct event_t {
> unsigned long long expected_mask;
> @@ -137,6 +140,22 @@ static void delete_objects(void)
> }
> }
>
> +static void clean_upper_dir(void)
> +{
> + unsigned int i;
> +
> + SAFE_UMOUNT(MOUNT_PATH);
> + SAFE_UMOUNT(OVL_MNT);
> +
> + SAFE_MOUNT(OVL_UPPER, MOUNT_PATH, "none", MS_BIND, NULL);
> + for (i = 0; i < ARRAY_SIZE(objects); i++)
> + SAFE_UNLINK(objects[i].path);
> + SAFE_UMOUNT(MOUNT_PATH);
> +
> + SAFE_MOUNT_OVERLAY();
> + SAFE_MOUNT(OVL_MNT, MOUNT_PATH, "none", MS_BIND, NULL);
> +}
> +
> static void get_object_stats(void)
> {
> unsigned int i;
> @@ -147,6 +166,17 @@ static void get_object_stats(void)
> }
> }
>
> +static void restore_objects(void)
> +{
> + if (TST_VARIANT_OVL_LOWER)
> + clean_upper_dir();
> + else
> + create_objects();
> +
> + /* Get the re-created object ids */
> + get_object_stats();
> +}
> +
> static int setup_marks(unsigned int fd, struct test_case_t *tc)
> {
> unsigned int i;
> @@ -340,6 +370,10 @@ static void do_test(unsigned int number)
> "Did not get an expected event (expected: %llx)",
> event_set[i].expected_mask);
> }
> +
> + /* Restore to state before delete_objects() */
> + if (tc->mask & FAN_DELETE_SELF)
> + restore_objects();
> out:
> SAFE_CLOSE(fanotify_fd);
> }
> @@ -367,14 +401,11 @@ static void do_setup(void)
> */
> if (tst_variant) {
> REQUIRE_HANDLE_TYPE_SUPPORTED_BY_KERNEL(AT_HANDLE_FID);
> - ovl_mounted = TST_MOUNT_OVERLAY();
> - if (!ovl_mounted)
> - return;
> + tst_create_overlay_dirs();
>
> - mnt = tst_variant & 1 ? OVL_LOWER : OVL_UPPER;
> + mnt = TST_VARIANT_OVL_LOWER ? OVL_LOWER : OVL_UPPER;
> } else {
> mnt = OVL_BASE_MNTPOINT;
> -
> }
> REQUIRE_FANOTIFY_INIT_FLAGS_SUPPORTED_ON_FS(FAN_REPORT_FID, mnt);
> SAFE_MKDIR(MOUNT_PATH, 0755);
> @@ -385,8 +416,14 @@ static void do_setup(void)
>
> /* Create file and directory objects for testing on base fs */
> create_objects();
> +
> + if (tst_variant) {
> + ovl_mounted = TST_MOUNT_OVERLAY();
> + if (!ovl_mounted)
> + return;
> + }
>
> - if (tst_variant > 2) {
> + if (TST_VARIANT_OVL_WATCH) {
> /* Setup watches on overlayfs */
> SAFE_MOUNT(OVL_MNT, MOUNT_PATH, "none", MS_BIND, NULL);
> ovl_bind_mounted = 1;
> --
> 2.54.0
>
More information about the ltp
mailing list