[Devel] [PATCH vz10] selftests: binderfs: skip the stress test without binderfs

Konstantin Khorenko khorenko at virtuozzo.com
Wed Sep 2 15:35:45 MSK 2026


> binderfs_test_stress mounts binderfs 32 times and asserts on the first
> mount, so on a kernel without CONFIG_ANDROID_BINDERFS the case fails
> rather than reporting that the filesystem is not there.
> 
> Probe once with a mount into a temporary directory and skip when the
> kernel answers ENODEV. Only ENODEV means the filesystem is missing;
> anything else is a real failure and still fails, as does a temporary
> directory we cannot create.
> 
> https://virtuozzo.atlassian.net/browse/VSTOR-142449
> Feature: fix selftests
> Signed-off-by: Eva Kurchatova <eva.kurchatova at virtuozzo.com>
>
> diff --git a/tools/testing/selftests/filesystems/binderfs/binderfs_test.c b/tools/testing/selftests/filesystems/binderfs/binderfs_test.c
> index 319567f0fae14..5d47e27e9dab8 100644
> --- a/tools/testing/selftests/filesystems/binderfs/binderfs_test.c
> +++ b/tools/testing/selftests/filesystems/binderfs/binderfs_test.c
> @@ -379,6 +379,17 @@ static void *binder_version_thread(void *data)
>   */
>  TEST(binderfs_stress)
>  {
> +	char probe[] = P_tmpdir "/binderfs_probe_XXXXXX";
> +	int probe_ret;
> +
> +	ASSERT_NE(NULL, mkdtemp(probe));
> +	probe_ret = mount(NULL, probe, "binder", 0, 0);
> +	if (!probe_ret)
> +		umount2(probe, MNT_DETACH);
> +	rmdir(probe);
> +	if (probe_ret && errno == ENODEV)

errno is checked after rmdir() => original errno has been already lost.

> +		SKIP(return, "The Android binderfs filesystem is not available");
> +

The block is inserted before other declarations, the style is strange.

>  	int fds[1000];
>  	int syncfds[2];
>  	pid_t pid;

Another angle of view:

  The probe cannot tell "no binderfs" from "no permission", and the
  unprivileged case is the whole point.

  path_mount() rejects an unprivileged caller in may_mount()
  (fs/namespace.c:4194, -EPERM) before do_new_mount() looks up the filesystem
  type and returns -ENODEV (fs/namespace.c:3887). A non-root probe therefore
  always gets EPERM, binderfs present or not.

  And binderfs_stress is meant to run unprivileged: change_idmaps() writes
  "0 <getuid()> 1" (binderfs_test.c:338), a single-id identity mapping an
  unprivileged process may write for its own child; change_userns() then gives
  it setid_userns_root(), and FS_USERNS_MOUNT on binder_fs_type permits the
  mount inside the userns. So for a non-root run without
  CONFIG_ANDROID_BINDERFS:

  - the probe in the parent gets EPERM, errno != ENODEV, no skip;
  - the child reaches the real mount() inside the userns, gets ENODEV, and
    ASSERT_EQ(ret, 0) fails - the original problem is untouched.



All-in-all, i would suggest another way of fixing it - check /proc/filesystems
instead:

  - tools/testing/selftests/landlock/fs_test.c:131
      supports_filesystem(), searches "nodev\t<fs>\n";
  - tools/testing/selftests/resctrl/resctrlfs.c:756
      check_resctrlfs_support(), searches "nodev\tresctrl\n";
  - tools/testing/selftests/mm/run_vmtests.sh:440
      same for xfs from shell.

A helper along with change_mountns():

static bool binderfs_supported(void)
{
      char line[128];
      bool ret = false;
      FILE *f;

      f = fopen("/proc/filesystems", "r");
      if (!f)
              return true;    /* Cannot tell - let the test run and report. */

      while (fgets(line, sizeof(line), f)) {
              /* binderfs has no backing device, hence the "nodev" prefix. */
              if (!strcmp(line, "nodev\tbinder\n")) {
                      ret = true;
                      break;
              }
      }

      fclose(f);
      return ret;
}

and in TEST(binderfs_stress) right after all declarations:

      if (!binderfs_supported())
              SKIP(return, "The Android binderfs filesystem is not available");

-- 
Konstantin Khorenko <khorenko at virtuozzo.com>


More information about the Devel mailing list