maps.debug/progs.debug may be inaccessible or absent (EPERM/EACCES/ENOENT) in some environments, which used to abort test_bpffs before it exercised the pin and rename checks. Treat these errors as "iter unavailable", log an INFO message, and continue with the core bpffs tests.
Signed-off-by: Sun Jian <[email protected]> --- .../selftests/bpf/prog_tests/test_bpffs.c | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/bpf/prog_tests/test_bpffs.c b/tools/testing/selftests/bpf/prog_tests/test_bpffs.c index e8021ff0581c..95a7d2582ba7 100644 --- a/tools/testing/selftests/bpf/prog_tests/test_bpffs.c +++ b/tools/testing/selftests/bpf/prog_tests/test_bpffs.c @@ -11,15 +11,18 @@ /* TDIR must be in a location we can create a directory in. */ #define TDIR "/tmp/test_bpffs_testdir" -static int read_iter(char *file) +static int read_iter(const char *file, int *save_errno) { /* 1024 should be enough to get contiguous 4 "iter" letters at some point */ char buf[1024]; int fd, len; fd = open(file, O_RDONLY); - if (fd < 0) + if (fd < 0) { + if (save_errno) + *save_errno = errno; return -1; + } while ((len = read(fd, buf, sizeof(buf) - 1)) > 0) { buf[len] = '\0'; if (strstr(buf, "iter")) { @@ -27,10 +30,33 @@ static int read_iter(char *file) return 0; } } + if (save_errno) + *save_errno = (len < 0) ? errno : 0; close(fd); return -1; } +static bool is_iter_skip_err(int err, int serrno) +{ + return err && (serrno == EPERM || serrno == EACCES || serrno == ENOENT); +} + +static int read_iter_or_skip(const char *file) +{ + int serrno = 0; + int err = read_iter(file, &serrno); + + if (is_iter_skip_err(err, serrno)) { + fprintf(stderr, + "INFO: %s unavailable (%d), skipping iter check\n", + file, + serrno); + return 0; + } + + return err; +} + static int fn(void) { struct stat a, b, c; @@ -69,13 +95,16 @@ static int fn(void) if (!ASSERT_OK(err, "mount bpffs " TDIR "/fs2")) goto out; - err = read_iter(TDIR "/fs1/maps.debug"); - if (!ASSERT_OK(err, "reading " TDIR "/fs1/maps.debug")) + err = read_iter_or_skip(TDIR "/fs1/maps.debug"); + if (err) { + ASSERT_OK(err, "reading " TDIR "/fs1/maps.debug"); goto out; - err = read_iter(TDIR "/fs2/progs.debug"); - if (!ASSERT_OK(err, "reading " TDIR "/fs2/progs.debug")) + } + err = read_iter_or_skip(TDIR "/fs2/progs.debug"); + if (err) { + ASSERT_OK(err, "reading " TDIR "/fs2/progs.debug"); goto out; - + } err = mkdir(TDIR "/fs1/a", 0777); if (!ASSERT_OK(err, "creating " TDIR "/fs1/a")) goto out; -- 2.43.0

