selftests/bpf: Fix d_path test
authorJiri Olsa <jolsa@kernel.org>
Thu, 31 Aug 2023 14:11:03 +0000 (16:11 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Thu, 31 Aug 2023 15:18:53 +0000 (17:18 +0200)
Recent commit [1] broke d_path test, because now filp_close is not called
directly from sys_close, but eventually later when the file is finally
released.

As suggested by Hou Tao we don't need to re-hook the bpf program, but just
instead we can use sys_close_range to trigger filp_close synchronously.

  [1] 021a160abf62 ("fs: use __fput_sync in close(2)")

Suggested-by: Hou Tao <houtao@huaweicloud.com>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20230831141103.359810-1-jolsa@kernel.org
tools/testing/selftests/bpf/prog_tests/d_path.c

index 911345c526e6a188bf97e2a02708a6cde0af53b2..ccc768592e66a6a1252d5ae3b24c12270da986ab 100644 (file)
 #include "test_d_path_check_rdonly_mem.skel.h"
 #include "test_d_path_check_types.skel.h"
 
+/* sys_close_range is not around for long time, so let's
+ * make sure we can call it on systems with older glibc
+ */
+#ifndef __NR_close_range
+#ifdef __alpha__
+#define __NR_close_range 546
+#else
+#define __NR_close_range 436
+#endif
+#endif
+
 static int duration;
 
 static struct {
@@ -90,7 +101,11 @@ static int trigger_fstat_events(pid_t pid)
        fstat(indicatorfd, &fileStat);
 
 out_close:
-       /* triggers filp_close */
+       /* sys_close no longer triggers filp_close, but we can
+        * call sys_close_range instead which still does
+        */
+#define close(fd) syscall(__NR_close_range, fd, fd, 0)
+
        close(pipefd[0]);
        close(pipefd[1]);
        close(sockfd);
@@ -98,6 +113,8 @@ out_close:
        close(devfd);
        close(localfd);
        close(indicatorfd);
+
+#undef close
        return ret;
 }