]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
pidref: introduce pidfd_inode_ids_supported helper
authorMike Yuan <me@yhndnzj.com>
Wed, 22 May 2024 11:27:36 +0000 (19:27 +0800)
committerMike Yuan <me@yhndnzj.com>
Fri, 14 Jun 2024 14:46:03 +0000 (16:46 +0200)
Also, correct the comment about pidfs (added in kernel 6.9
rather than 6.8).

Co-authored-by: Lennart Poettering <lennart@poettering.net>
src/basic/pidref.c

index 69a010210dde64bd0d75a2ec62801df87d64d477..11abadff8260cc6b58be79829226e443efae7412 100644 (file)
@@ -6,6 +6,7 @@
 
 #include "errno-util.h"
 #include "fd-util.h"
+#include "missing_magic.h"
 #include "missing_syscall.h"
 #include "missing_wait.h"
 #include "parse-util.h"
 #include "signal-util.h"
 #include "stat-util.h"
 
+static int pidfd_inode_ids_supported(void) {
+        static int cached = -1;
+
+        if (cached >= 0)
+                return cached;
+
+        _cleanup_close_ int fd = pidfd_open(getpid_cached(), 0);
+        if (fd < 0) {
+                if (ERRNO_IS_NOT_SUPPORTED(errno))
+                        return (cached = false);
+
+                return -errno;
+        }
+
+        return (cached = fd_is_fs_type(fd, PID_FS_MAGIC));
+}
+
 bool pidref_equal(const PidRef *a, const PidRef *b) {
         int r;
 
@@ -28,8 +46,11 @@ bool pidref_equal(const PidRef *a, const PidRef *b) {
                         return true;
 
                 /* pidfds live in their own pidfs and each process comes with a unique inode number since
-                 * kernel 6.8. We can safely do this on older kernels too though, as previously anonymous
-                 * inode was used and inode number was the same for all pidfds. */
+                 * kernel 6.9. */
+
+                if (pidfd_inode_ids_supported() <= 0)
+                        return true;
+
                 r = fd_inode_same(a->fd, b->fd);
                 if (r < 0)
                         log_debug_errno(r, "Failed to check whether pidfds for pid " PID_FMT " are equal, assuming yes: %m",