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 <lennart@poettering.net>
This commit is contained in:
Mike Yuan 2024-05-22 19:27:36 +08:00
parent 432977a0a4
commit 1b6239632d
No known key found for this signature in database
GPG key ID: 417471C0A40F58B3

View 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"
@ -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",