mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Luis Henriques <luis@igalia.com>
To: Amir Goldstein <amir73il@gmail.com>
Cc: Miklos Szeredi <miklos@szeredi.hu>,
	 Chen Linxuan <me@black-desk.cn>,
	Jonathan Corbet <corbet@lwn.net>,
	 Shuah Khan <skhan@linuxfoundation.org>,
	 fuse-devel@lists.linux.dev, linux-kernel@vger.kernel.org,
	 linux-kselftest@vger.kernel.org,
	 Matt Harvey <mharvey@jumptrading.com>,
	 kernel-dev@igalia.com
Subject: Re: [RFC PATCH v3 4/8] selftests/fuse: factor-out test fixture setup/teardown
Date: Mon, 07 Sep 2026 11:44:59 +0100	[thread overview]
Message-ID: <87pkypfihg.fsf@wotan.olymp> (raw)
In-Reply-To: <CAOQ4uxgR8v6H=8fHMmLjChsuXUn8560nzda55t8pCNA1ocvg_A@mail.gmail.com> (Amir Goldstein's message of "Sat, 5 Sep 2026 14:45:08 +0200")

On Sat, Sep 05 2026, Amir Goldstein wrote:

> On Fri, Sep 4, 2026 at 12:38 PM Luis Henriques <luis@igalia.com> wrote:
>>
>> In order to reduce new tests setup/teardown code duplication, factor-out
>> these functions from the existing acl_cache test into a new fuse_common.c
>> file that can be reused in other tests.
>>
>> Signed-off-by: Luis Henriques <luis@igalia.com>
>> ---
>>  .../selftests/filesystems/fuse/Makefile       |  8 ++-
>>  .../filesystems/fuse/fuse_acl_cache_test.c    | 62 +++----------------
>>  .../selftests/filesystems/fuse/fuse_common.c  | 60 ++++++++++++++++++
>>  .../selftests/filesystems/fuse/fuse_common.h  | 25 ++++++++
>>  4 files changed, 100 insertions(+), 55 deletions(-)
>>  create mode 100644 tools/testing/selftests/filesystems/fuse/fuse_common.c
>>  create mode 100644 tools/testing/selftests/filesystems/fuse/fuse_common.h
>>
>> diff --git a/tools/testing/selftests/filesystems/fuse/Makefile b/tools/testing/selftests/filesystems/fuse/Makefile
>> index a3ee9b3a2f5d..7744f796eb06 100644
>> --- a/tools/testing/selftests/filesystems/fuse/Makefile
>> +++ b/tools/testing/selftests/filesystems/fuse/Makefile
>> @@ -21,8 +21,12 @@ ifeq ($(VAR_LDLIBS),)
>>  VAR_LDLIBS := -lfuse3 -pthread
>>  endif
>>
>> +CFLAGS += $(VAR_CFLAGS)
>> +LDLIBS += $(VAR_LDLIBS)
>> +
>>  $(OUTPUT)/fuse_mnt: CFLAGS += $(VAR_CFLAGS)
>>  $(OUTPUT)/fuse_mnt: LDLIBS += $(VAR_LDLIBS)
>>
>> -$(OUTPUT)/fuse_acl_cache_test: CFLAGS += $(VAR_CFLAGS)
>> -$(OUTPUT)/fuse_acl_cache_test: LDLIBS += $(VAR_LDLIBS)
>> +$(OUTPUT)/fuse_acl_cache_test: fuse_common.c fuse_acl_cache_test.c
>> +
>> +EXTRA_CLEAN := fuse_common.o
>> diff --git a/tools/testing/selftests/filesystems/fuse/fuse_acl_cache_test.c b/tools/testing/selftests/filesystems/fuse/fuse_acl_cache_test.c
>> index 2411a6e285f1..12cbf9753d03 100644
>> --- a/tools/testing/selftests/filesystems/fuse/fuse_acl_cache_test.c
>> +++ b/tools/testing/selftests/filesystems/fuse/fuse_acl_cache_test.c
>> @@ -33,23 +33,15 @@
>>   */
>>
>>  #define _GNU_SOURCE
>> -#include <errno.h>
>>  #include <fcntl.h>
>>  #include <linux/limits.h>
>> -#include <pthread.h>
>>  #include <stdint.h>
>> -#include <stdio.h>
>> -#include <stdlib.h>
>> -#include <string.h>
>> -#include <sys/stat.h>
>>  #include <sys/xattr.h>
>> -#include <unistd.h>
>> -
>> -#define FUSE_USE_VERSION 31
>> -#include <fuse_lowlevel.h>
>>
>>  #include "kselftest_harness.h"
>>
>> +#include "fuse_common.h"
>> +
>>  /* ---- ACL binary encoding ------------------------------------------------ */
>>  /*
>>   * POSIX ACL v2 xattr format (little-endian):
>> @@ -176,69 +168,33 @@ static const struct fuse_lowlevel_ops fs_ops = {
>>         .getxattr = fs_getxattr,
>>  };
>>
>> -/* ---- Daemon thread ------------------------------------------------------- */
>> -
>> -static void *run_daemon(void *arg)
>> -{
>> -       fuse_session_loop((struct fuse_session *)arg);
>> -       return NULL;
>> -}
>> -
>>  /* ---- kselftest harness --------------------------------------------------- */
>>
>>  FIXTURE(acl_cache) {
>>         struct fuse_session *se;
>> -       char                 mountpoint[PATH_MAX];
>> +       char                 mountpoint[MOUNTPOINT_SZ];
>>         char                 file_path[PATH_MAX];
>>         pthread_t            thread;
>>  };
>
> Nice!
> I think it would be even nicer to have struct fuse_common_ctx
> with the common members embedded in the per test state,
> but I'll let you decide if you want to do that or not.

Thanks for the suggestion.  It may make sense indeed to have that common
struct, although it would probably only include the spinlock and a bool
for enabling/disabling the cache.  I'll have a closer look and see if it
makes sense.

Cheers,
-- 
Luís

>
> Thanks,
> Amir.
>
>>
>>  FIXTURE_SETUP(acl_cache)
>>  {
>> -       char *fuse_argv[] = { "fuse_acl_cache_test", NULL };
>> -       struct fuse_args args = FUSE_ARGS_INIT(1, fuse_argv);
>> +       char err[MAX_ERR_MSG];
>>
>> -       g_ds.acl            = acl_a;
>> -       g_ds.acl_size       = sizeof(acl_a);
>> +       g_ds.acl = acl_a;
>> +       g_ds.acl_size = sizeof(acl_a);
>>         g_ds.getxattr_count = 0;
>>
>> -       strcpy(self->mountpoint, "/tmp/acl_cache_test_XXXXXX");
>> -       if (!mkdtemp(self->mountpoint))
>> -               SKIP(return, "mkdtemp: %s", strerror(errno));
>> +       if (fs_setup(&self->se, self->mountpoint, &fs_ops, &self->thread, err))
>> +               SKIP(return, err);
>>
>>         snprintf(self->file_path, sizeof(self->file_path),
>>                  "%s/" FILE_NAME, self->mountpoint);
>> -
>> -       self->se = fuse_session_new(&args, &fs_ops, sizeof(fs_ops), NULL);
>> -       if (!self->se) {
>> -               rmdir(self->mountpoint);
>> -               SKIP(return, "fuse_session_new failed");
>> -       }
>> -
>> -       if (fuse_session_mount(self->se, self->mountpoint)) {
>> -               fuse_session_destroy(self->se);
>> -               rmdir(self->mountpoint);
>> -               SKIP(return, "fuse_session_mount failed "
>> -                            "(missing fusermount3 or insufficient privileges)");
>> -       }
>> -
>> -       if (pthread_create(&self->thread, NULL, run_daemon, self->se)) {
>> -               fuse_session_unmount(self->se);
>> -               fuse_session_destroy(self->se);
>> -               rmdir(self->mountpoint);
>> -               SKIP(return, "pthread_create: %s", strerror(errno));
>> -       }
>> -
>> -       fuse_opt_free_args(&args);
>>  }
>>
>>  FIXTURE_TEARDOWN(acl_cache)
>>  {
>> -       fuse_session_exit(self->se);
>> -       fuse_session_unmount(self->se);
>> -       pthread_join(self->thread, NULL);
>> -       fuse_session_destroy(self->se);
>> -       rmdir(self->mountpoint);
>> +       fs_teardown(self->se, self->thread, self->mountpoint);
>>  }
>>
>>  static int do_force_statx(const char *path)
>> diff --git a/tools/testing/selftests/filesystems/fuse/fuse_common.c b/tools/testing/selftests/filesystems/fuse/fuse_common.c
>> new file mode 100644
>> index 000000000000..3a91cac25b81
>> --- /dev/null
>> +++ b/tools/testing/selftests/filesystems/fuse/fuse_common.c
>> @@ -0,0 +1,60 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +
>> +#include "fuse_common.h"
>> +
>> +static void *run_daemon(void *arg)
>> +{
>> +       fuse_session_loop((struct fuse_session *)arg);
>> +       return NULL;
>> +}
>> +
>> +int fs_setup(struct fuse_session **se, char *mountpoint,
>> +            const struct fuse_lowlevel_ops *fs_ops,
>> +            pthread_t *thread, char *err)
>> +{
>> +       char *fuse_argv[] = { "fuse_test", NULL };
>> +       struct fuse_args args = FUSE_ARGS_INIT(1, fuse_argv);
>> +
>> +       strcpy(mountpoint, MOUNTPOINT_TEMPLATE);
>> +       if (!mkdtemp(mountpoint)) {
>> +               snprintf(err, MAX_ERR_MSG, "mkdtemp: %s", strerror(errno));
>> +               return -1;
>> +       }
>> +
>> +       *se = fuse_session_new(&args, fs_ops, sizeof(*fs_ops), NULL);
>> +       if (!*se) {
>> +               rmdir(mountpoint);
>> +               snprintf(err, MAX_ERR_MSG, "fuse_session_new failed");
>> +               return -1;
>> +       }
>> +
>> +       if (fuse_session_mount(*se, mountpoint)) {
>> +               fuse_session_destroy(*se);
>> +               rmdir(mountpoint);
>> +               snprintf(err, MAX_ERR_MSG, "fuse_session_mount failed "
>> +                       "(missing fusermount3 or insufficient privileges)");
>> +               return -1;
>> +       }
>> +
>> +       if (pthread_create(thread, NULL, run_daemon, *se)) {
>> +               fuse_session_unmount(*se);
>> +               fuse_session_destroy(*se);
>> +               rmdir(mountpoint);
>> +               snprintf(err, MAX_ERR_MSG, "pthread_create: %s", strerror(errno));
>> +               return -1;
>> +       }
>> +
>> +       fuse_opt_free_args(&args);
>> +
>> +       return 0;
>> +}
>> +
>> +void fs_teardown(struct fuse_session *se, pthread_t thread, char *mountpoint)
>> +{
>> +       fuse_session_exit(se);
>> +       fuse_session_unmount(se);
>> +       pthread_join(thread, NULL);
>> +       fuse_session_destroy(se);
>> +       rmdir(mountpoint);
>> +}
>> +
>> diff --git a/tools/testing/selftests/filesystems/fuse/fuse_common.h b/tools/testing/selftests/filesystems/fuse/fuse_common.h
>> new file mode 100644
>> index 000000000000..77d5eb58550d
>> --- /dev/null
>> +++ b/tools/testing/selftests/filesystems/fuse/fuse_common.h
>> @@ -0,0 +1,25 @@
>> +#ifndef __SELFTEST_FUSE_COMMON_H__
>> +#define __SELFTEST_FUSE_COMMON_H__
>> +
>> +#define _GNU_SOURCE
>> +#include <errno.h>
>> +#include <pthread.h>
>> +#include <stdio.h>
>> +#include <stdlib.h>
>> +#include <string.h>
>> +#include <unistd.h>
>> +
>> +#define FUSE_USE_VERSION 31
>> +#include <fuse_lowlevel.h>
>> +
>> +#define MAX_ERR_MSG 256
>> +
>> +#define MOUNTPOINT_TEMPLATE "/tmp/fuse_test_XXXXXX"
>> +#define MOUNTPOINT_SZ 64
>> +
>> +int fs_setup(struct fuse_session **se, char *mountpoint,
>> +            const struct fuse_lowlevel_ops *fs_ops,
>> +            pthread_t *thread, char *err);
>> +void fs_teardown(struct fuse_session *se, pthread_t thread, char *mountpoint);
>> +
>> +#endif /* __SELFTEST_FUSE_COMMON_H__ */


  reply	other threads:[~2026-09-07 10:44 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-04 10:39 [RFC PATCH v3 0/8] fuse: caches documentation and testing Luis Henriques
2026-09-04 10:39 ` [RFC PATCH v3 1/8] Documentation: fuse: add document on caches being used by FUSE Luis Henriques
2026-09-05 21:04   ` Amir Goldstein
2026-09-07 10:38     ` Luis Henriques
2026-09-04 10:39 ` [RFC PATCH v3 2/8] selftests/fuse: convert fusectl test to fuse3 Luis Henriques
2026-09-04 10:39 ` [RFC PATCH v3 3/8] selftests/fuse: check that fusectlfs is mounted Luis Henriques
2026-09-05 13:59   ` Amir Goldstein
2026-09-04 10:39 ` [RFC PATCH v3 4/8] selftests/fuse: factor-out test fixture setup/teardown Luis Henriques
2026-09-05 12:45   ` Amir Goldstein
2026-09-07 10:44     ` Luis Henriques [this message]
2026-09-07 11:38       ` Amir Goldstein
2026-09-04 10:39 ` [RFC PATCH v3 5/8] selftests/fuse: use dynamically allocated memory to store ACLs Luis Henriques
2026-09-05 14:00   ` Amir Goldstein
2026-09-04 10:39 ` [RFC PATCH v3 6/8] selftests/fuse: add some extra ACL caching tests Luis Henriques
2026-09-05 12:38   ` Amir Goldstein
2026-09-07 10:48     ` Luis Henriques
2026-09-04 10:39 ` [RFC PATCH v3 7/8] selftests/fuse: add fuse symlink caching test Luis Henriques
2026-09-05 12:32   ` Amir Goldstein
2026-09-07 10:58     ` Luis Henriques
2026-09-04 10:39 ` [RFC PATCH v3 8/8] selftests/fuse: add fuse readdir " Luis Henriques
2026-09-05 14:11   ` Amir Goldstein
2026-09-07 10:55     ` Luis Henriques

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=87pkypfihg.fsf@wotan.olymp \
    --to=luis@igalia.com \
    --cc=amir73il@gmail.com \
    --cc=corbet@lwn.net \
    --cc=fuse-devel@lists.linux.dev \
    --cc=kernel-dev@igalia.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=me@black-desk.cn \
    --cc=mharvey@jumptrading.com \
    --cc=miklos@szeredi.hu \
    --cc=skhan@linuxfoundation.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®