From: Mike Yuan Date: Wed, 22 May 2024 11:27:36 +0000 (+0800) Subject: pidref: introduce pidfd_inode_ids_supported helper X-Git-Tag: v257-rc1~1126^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b6239632dd9697c435d5862a9e2417ee990c6c0;p=thirdparty%2Fsystemd.git pidref: introduce pidfd_inode_ids_supported helper Also, correct the comment about pidfs (added in kernel 6.9 rather than 6.8). Co-authored-by: Lennart Poettering --- diff --git a/src/basic/pidref.c b/src/basic/pidref.c index 69a010210dd..11abadff826 100644 --- a/src/basic/pidref.c +++ b/src/basic/pidref.c @@ -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" @@ -14,6 +15,23 @@ #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",