From cf337561d83100dd8cd7cffbcb3a35f491b97085e4199db3d946175d52bb94ee Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Thu, 16 May 2024 09:01:08 +0000 Subject: [PATCH] Accepting request 1174396 from home:jirislaby:branches:Base:System - add support for pidfs in kernel 6.9 (bsc#1224285) * 0001-include-Include-unistd.h-in-pidfd-utils.h-for-syscal.patch * 0002-lsfd-Refactor-the-pidfd-logic-into-lsfd-pidfd.c.patch * 0003-lsfd-Support-pidfs.patch * 0004-lsfd-test-Adapt-test-cases-for-pidfs.patch OBS-URL: https://build.opensuse.org/request/show/1174396 OBS-URL: https://build.opensuse.org/package/show/Base:System/util-linux?expand=0&rev=564 --- ...unistd.h-in-pidfd-utils.h-for-syscal.patch | 32 ++ ...or-the-pidfd-logic-into-lsfd-pidfd.c.patch | 319 ++++++++++++++++++ 0003-lsfd-Support-pidfs.patch | 186 ++++++++++ ...lsfd-test-Adapt-test-cases-for-pidfs.patch | 142 ++++++++ util-linux.changes | 9 + util-linux.spec | 4 + 6 files changed, 692 insertions(+) create mode 100644 0001-include-Include-unistd.h-in-pidfd-utils.h-for-syscal.patch create mode 100644 0002-lsfd-Refactor-the-pidfd-logic-into-lsfd-pidfd.c.patch create mode 100644 0003-lsfd-Support-pidfs.patch create mode 100644 0004-lsfd-test-Adapt-test-cases-for-pidfs.patch diff --git a/0001-include-Include-unistd.h-in-pidfd-utils.h-for-syscal.patch b/0001-include-Include-unistd.h-in-pidfd-utils.h-for-syscal.patch new file mode 100644 index 0000000..8a61064 --- /dev/null +++ b/0001-include-Include-unistd.h-in-pidfd-utils.h-for-syscal.patch @@ -0,0 +1,32 @@ +From: Xi Ruoyao +Date: Sun, 31 Mar 2024 00:42:03 +0800 +Subject: include: Include in pidfd-utils.h for syscall() +Git-repo: https://github.com/util-linux/util-linux.git +Git-commit: 10add327c608b11b3d70215048aade4d1797b1fd +Patch-mainline: yes +References: kernel 6.9 + +In Glibc, only contains SYS_* macros and the syscall() +function is in . So include it. + +Signed-off-by: Xi Ruoyao +Signed-off-by: Jiri Slaby +--- + include/pidfd-utils.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/include/pidfd-utils.h b/include/pidfd-utils.h +index ff0bc4c7..0ee55f3b 100644 +--- a/include/pidfd-utils.h ++++ b/include/pidfd-utils.h +@@ -7,6 +7,7 @@ + + #ifdef HAVE_SYS_SYSCALL_H + # include ++# include + + /* + * If the kernel headers are too old to provide the syscall numbers, let's +-- +2.45.0 + diff --git a/0002-lsfd-Refactor-the-pidfd-logic-into-lsfd-pidfd.c.patch b/0002-lsfd-Refactor-the-pidfd-logic-into-lsfd-pidfd.c.patch new file mode 100644 index 0000000..9ee6f85 --- /dev/null +++ b/0002-lsfd-Refactor-the-pidfd-logic-into-lsfd-pidfd.c.patch @@ -0,0 +1,319 @@ +From: Xi Ruoyao +Date: Wed, 3 Apr 2024 15:29:34 +0800 +Subject: lsfd: Refactor the pidfd logic into lsfd-pidfd.c +Git-repo: https://github.com/util-linux/util-linux.git +Git-commit: bf6645dc1edef09ad378cc5b9eb2c93861408735 +Patch-mainline: yes +References: kernel 6.9 + +We'll reuse these logic for pidfd support on Linux >= 6.9. This should +be a no-functional change. + +Besides moving the code, this change also renames anon_pidfd_data to +pidfd_data, and removes a redundant nullity check for free (because +free(NULL) will just do nothing per the C standard). + +Signed-off-by: Xi Ruoyao +Signed-off-by: Jiri Slaby +--- + misc-utils/Makemodule.am | 4 +- + misc-utils/lsfd-pidfd.c | 95 ++++++++++++++++++++++++++++++++++++++++ + misc-utils/lsfd-pidfd.h | 37 ++++++++++++++++ + misc-utils/lsfd-unkn.c | 71 +++++------------------------- + misc-utils/meson.build | 1 + + 5 files changed, 147 insertions(+), 61 deletions(-) + create mode 100644 misc-utils/lsfd-pidfd.c + create mode 100644 misc-utils/lsfd-pidfd.h + +diff --git a/misc-utils/Makemodule.am b/misc-utils/Makemodule.am +index 9edf3d98..7622a5d7 100644 +--- a/misc-utils/Makemodule.am ++++ b/misc-utils/Makemodule.am +@@ -298,7 +298,9 @@ lsfd_SOURCES = \ + misc-utils/lsfd-sock.h \ + misc-utils/lsfd-sock-xinfo.c \ + misc-utils/lsfd-unkn.c \ +- misc-utils/lsfd-fifo.c ++ misc-utils/lsfd-fifo.c \ ++ misc-utils/lsfd-pidfd.h \ ++ misc-utils/lsfd-pidfd.c + lsfd_LDADD = $(LDADD) $(MQ_LIBS) libsmartcols.la libcommon.la + lsfd_CFLAGS = $(AM_CFLAGS) -I$(ul_libsmartcols_incdir) + endif +diff --git a/misc-utils/lsfd-pidfd.c b/misc-utils/lsfd-pidfd.c +new file mode 100644 +index 00000000..430a8028 +--- /dev/null ++++ b/misc-utils/lsfd-pidfd.c +@@ -0,0 +1,95 @@ ++/* ++ * lsfd-pidfd.c - handle pidfd (from anon_inode or pidfs) ++ * ++ * Copyright (C) 2024 Xi Ruoyao ++ * ++ * Refactored and moved out from lsfd-unkn.c (originally authored by ++ * Masatake YAMATO ). ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it would be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include ++ ++#include "strutils.h" ++#include "xalloc.h" ++ ++#include "lsfd.h" ++#include "lsfd-pidfd.h" ++ ++int pidfd_handle_fdinfo(struct pidfd_data *data, const char *key, ++ const char *value) ++{ ++ if (strcmp(key, "Pid") == 0) { ++ uint64_t pid; ++ int rc = ul_strtou64(value, &pid, 10); ++ ++ if (rc < 0) ++ return 0; /* ignore -- parse failed */ ++ ++ data->pid = (pid_t)pid; ++ return 1; ++ } else if (strcmp(key, "NSpid") == 0) { ++ data->nspid = xstrdup(value); ++ return 1; ++ } ++ ++ return 0; ++} ++ ++char *pidfd_get_name(struct pidfd_data *data) ++{ ++ char *str = NULL; ++ char *comm = NULL; ++ struct proc *proc = get_proc(data->pid); ++ ++ if (proc) ++ comm = proc->command; ++ ++ xasprintf(&str, "pid=%d comm=%s nspid=%s", ++ data->pid, ++ comm ? comm : "", ++ data->nspid ? data->nspid : ""); ++ return str; ++} ++ ++bool pidfd_fill_column(struct pidfd_data *data, int column_id, char **str) ++{ ++ switch(column_id) { ++ case COL_PIDFD_COMM: { ++ struct proc *pidfd_proc = get_proc(data->pid); ++ char *pidfd_comm = NULL; ++ ++ if (pidfd_proc) ++ pidfd_comm = pidfd_proc->command; ++ if (pidfd_comm) { ++ *str = xstrdup(pidfd_comm); ++ return true; ++ } ++ break; ++ } ++ case COL_PIDFD_NSPID: ++ if (data->nspid) { ++ *str = xstrdup(data->nspid); ++ return true; ++ } ++ break; ++ case COL_PIDFD_PID: ++ xasprintf(str, "%d", (int)data->pid); ++ return true; ++ } ++ ++ return false; ++} +diff --git a/misc-utils/lsfd-pidfd.h b/misc-utils/lsfd-pidfd.h +new file mode 100644 +index 00000000..2f65d3b3 +--- /dev/null ++++ b/misc-utils/lsfd-pidfd.h +@@ -0,0 +1,37 @@ ++/* ++ * lsfd-pidfd.h - handle pidfd (from anon_inode or pidfs) ++ * ++ * Copyright (C) 2024 Xi Ruoyao ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it would be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software Foundation, ++ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include ++#include ++ ++struct pidfd_data { ++ pid_t pid; ++ char *nspid; ++}; ++ ++int pidfd_handle_fdinfo(struct pidfd_data *, const char *, const char *); ++char *pidfd_get_name(struct pidfd_data *); ++bool pidfd_fill_column(struct pidfd_data *, int, char **); ++ ++static inline void __attribute__((nonnull(1))) ++pidfd_free(struct pidfd_data *data) ++{ ++ free(data->nspid); ++} +diff --git a/misc-utils/lsfd-unkn.c b/misc-utils/lsfd-unkn.c +index 8f6e9084..8e257f47 100644 +--- a/misc-utils/lsfd-unkn.c ++++ b/misc-utils/lsfd-unkn.c +@@ -28,6 +28,7 @@ + #include "timeutils.h" + + #include "lsfd.h" ++#include "lsfd-pidfd.h" + + #define offsetofend(TYPE, MEMBER) \ + (offsetof(TYPE, MEMBER) + sizeof_member(TYPE, MEMBER)) +@@ -183,10 +184,6 @@ static int unkn_handle_fdinfo(struct file *file, const char *key, const char *va + /* + * pidfd + */ +-struct anon_pidfd_data { +- pid_t pid; +- char *nspid; +-}; + + static bool anon_pidfd_probe(const char *str) + { +@@ -195,51 +192,28 @@ static bool anon_pidfd_probe(const char *str) + + static char *anon_pidfd_get_name(struct unkn *unkn) + { +- char *str = NULL; +- struct anon_pidfd_data *data = (struct anon_pidfd_data *)unkn->anon_data; ++ struct pidfd_data *data = (struct pidfd_data *)unkn->anon_data; + +- char *comm = NULL; +- struct proc *proc = get_proc(data->pid); +- if (proc) +- comm = proc->command; +- +- xasprintf(&str, "pid=%d comm=%s nspid=%s", +- data->pid, +- comm? comm: "", +- data->nspid? data->nspid: ""); +- return str; ++ return pidfd_get_name(data); + } + + static void anon_pidfd_init(struct unkn *unkn) + { +- unkn->anon_data = xcalloc(1, sizeof(struct anon_pidfd_data)); ++ unkn->anon_data = xcalloc(1, sizeof(struct pidfd_data)); + } + + static void anon_pidfd_free(struct unkn *unkn) + { +- struct anon_pidfd_data *data = (struct anon_pidfd_data *)unkn->anon_data; ++ struct pidfd_data *data = (struct pidfd_data *)unkn->anon_data; + +- if (data->nspid) +- free(data->nspid); ++ pidfd_free(data); + free(data); + } + + static int anon_pidfd_handle_fdinfo(struct unkn *unkn, const char *key, const char *value) + { +- if (strcmp(key, "Pid") == 0) { +- uint64_t pid; +- +- int rc = ul_strtou64(value, &pid, 10); +- if (rc < 0) +- return 0; /* ignore -- parse failed */ +- ((struct anon_pidfd_data *)unkn->anon_data)->pid = (pid_t)pid; +- return 1; +- } else if (strcmp(key, "NSpid") == 0) { +- ((struct anon_pidfd_data *)unkn->anon_data)->nspid = xstrdup(value); +- return 1; +- +- } +- return 0; ++ return pidfd_handle_fdinfo((struct pidfd_data *)unkn->anon_data, ++ key, value); + } + + static bool anon_pidfd_fill_column(struct proc *proc __attribute__((__unused__)), +@@ -249,32 +223,9 @@ static bool anon_pidfd_fill_column(struct proc *proc __attribute__((__unused__) + size_t column_index __attribute__((__unused__)), + char **str) + { +- struct anon_pidfd_data *data = (struct anon_pidfd_data *)unkn->anon_data; +- +- switch(column_id) { +- case COL_PIDFD_COMM: { +- struct proc *pidfd_proc = get_proc(data->pid); +- char *pidfd_comm = NULL; +- if (pidfd_proc) +- pidfd_comm = pidfd_proc->command; +- if (pidfd_comm) { +- *str = xstrdup(pidfd_comm); +- return true; +- } +- break; +- } +- case COL_PIDFD_NSPID: +- if (data->nspid) { +- *str = xstrdup(data->nspid); +- return true; +- } +- break; +- case COL_PIDFD_PID: +- xasprintf(str, "%d", (int)data->pid); +- return true; +- } +- +- return false; ++ return pidfd_fill_column((struct pidfd_data *)unkn->anon_data, ++ column_id, ++ str); + } + + static const struct anon_ops anon_pidfd_ops = { +diff --git a/misc-utils/meson.build b/misc-utils/meson.build +index 847b1012..68ea9777 100644 +--- a/misc-utils/meson.build ++++ b/misc-utils/meson.build +@@ -56,6 +56,7 @@ lsfd_sources = files ( + 'lsfd-sock-xinfo.c', + 'lsfd-unkn.c', + 'lsfd-fifo.c', ++ 'lsfd-pidfd.c', + ) + + uuidgen_sources = files( +-- +2.45.0 + diff --git a/0003-lsfd-Support-pidfs.patch b/0003-lsfd-Support-pidfs.patch new file mode 100644 index 0000000..a914b3d --- /dev/null +++ b/0003-lsfd-Support-pidfs.patch @@ -0,0 +1,186 @@ +From: Xi Ruoyao +Date: Wed, 3 Apr 2024 15:46:57 +0800 +Subject: lsfd: Support pidfs +Git-repo: https://github.com/util-linux/util-linux.git +Git-commit: b1a48efd173c7f37d8df39a84eb25b4440335661 +Patch-mainline: yes +References: kernel 6.9 + +In Linux 6.9 pidfds are moved from the anonymous inode infrastructure to +a tiny pseudo filesystem named pidfs. Recognize it properly. + +Fixes #2865. + +Signed-off-by: Xi Ruoyao +Signed-off-by: Jiri Slaby +--- + misc-utils/lsfd-file.c | 96 ++++++++++++++++++++++++++++++++++++++++++ + misc-utils/lsfd.c | 3 ++ + misc-utils/lsfd.h | 7 ++- + 3 files changed, 105 insertions(+), 1 deletion(-) + +diff --git a/misc-utils/lsfd-file.c b/misc-utils/lsfd-file.c +index 9b91462d..3f330146 100644 +--- a/misc-utils/lsfd-file.c ++++ b/misc-utils/lsfd-file.c +@@ -45,6 +45,8 @@ + #include "procfs.h" + + #include "lsfd.h" ++#include "lsfd-pidfd.h" ++#include "pidfd-utils.h" + + static struct idcache *username_cache; + +@@ -492,6 +494,22 @@ static unsigned long get_minor_for_mqueue(void) + return minor(sb.st_dev); + } + ++static unsigned long get_minor_for_pidfs(void) ++{ ++ int fd = pidfd_open(getpid(), 0); ++ struct stat sb; ++ unsigned long ret = 0; ++ ++ if (fd < 0) ++ return 0; ++ ++ if (fstat(fd, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFREG) ++ ret = minor(sb.st_dev); ++ ++ close(fd); ++ return ret; ++} ++ + static void file_class_initialize(void) + { + unsigned long m; +@@ -510,6 +528,10 @@ static void file_class_initialize(void) + m = get_minor_for_mqueue(); + if (m) + add_nodev(m, "mqueue"); ++ ++ m = get_minor_for_pidfs(); ++ if (m) ++ add_nodev(m, "pidfs"); + } + + static void file_class_finalize(void) +@@ -783,3 +805,77 @@ const struct file_class mqueue_file_class = { + .fill_column = mqueue_file_fill_column, + .get_ipc_class = mqueue_file_get_ipc_class, + }; ++ ++struct pidfs_file { ++ struct file file; ++ struct pidfd_data data; ++}; ++ ++static void init_pidfs_file_content(struct file *file) ++{ ++ struct pidfs_file *pidfs_file = (struct pidfs_file *)file; ++ ++ memset(&pidfs_file->data, 0, sizeof(pidfs_file->data)); ++} ++ ++static int pidfs_file_handle_fdinfo(struct file *file, const char *key, const char *value) ++{ ++ struct pidfs_file *pidfs_file = (struct pidfs_file *)file; ++ ++ return pidfd_handle_fdinfo(&pidfs_file->data, key, value); ++} ++ ++static void pidfs_file_free_content(struct file *file) ++{ ++ struct pidfs_file *pidfs_file = (struct pidfs_file *)file; ++ ++ pidfd_free(&pidfs_file->data); ++} ++ ++static bool pidfs_file_fill_column(struct proc *proc __attribute__((__unused__)), ++ struct file *file, ++ struct libscols_line *ln, ++ int column_id, ++ size_t column_index) ++{ ++ struct pidfs_file *pidfs_file = (struct pidfs_file *)file; ++ char *buf = NULL; ++ ++ switch(column_id) { ++ case COL_TYPE: ++ if (scols_line_set_data(ln, column_index, "pidfd")) ++ err(EXIT_FAILURE, _("failed to add output data")); ++ return true; ++ case COL_NAME: ++ buf = pidfd_get_name(&pidfs_file->data); ++ break; ++ default: ++ if (!pidfd_fill_column(&pidfs_file->data, column_id, &buf)) ++ return false; ++ } ++ ++ if (buf && ++ scols_line_refer_data(ln, column_index, buf)) ++ err(EXIT_FAILURE, _("failed to add output data")); ++ ++ return true; ++} ++ ++const struct file_class pidfs_file_class = { ++ .super = &file_class, ++ .size = sizeof(struct pidfs_file), ++ .initialize_content = init_pidfs_file_content, ++ .handle_fdinfo = pidfs_file_handle_fdinfo, ++ .fill_column = pidfs_file_fill_column, ++ .free_content = pidfs_file_free_content, ++}; ++ ++bool is_pidfs_dev(dev_t dev) ++{ ++ const char *fs = get_nodev_filesystem(minor(dev)); ++ ++ if (fs && (strcmp (fs, "pidfs") == 0)) ++ return true; ++ ++ return false; ++} +diff --git a/misc-utils/lsfd.c b/misc-utils/lsfd.c +index 98820ee8..01e88d51 100644 +--- a/misc-utils/lsfd.c ++++ b/misc-utils/lsfd.c +@@ -683,6 +683,9 @@ static const struct file_class *stat2class(struct stat *sb) + if (is_mqueue_dev(dev)) + return &mqueue_file_class; + ++ if (is_pidfs_dev(dev)) ++ return &pidfs_file_class; ++ + return &file_class; + default: + break; +diff --git a/misc-utils/lsfd.h b/misc-utils/lsfd.h +index e646758c..f0f17d5b 100644 +--- a/misc-utils/lsfd.h ++++ b/misc-utils/lsfd.h +@@ -228,7 +228,7 @@ struct file_class { + }; + + extern const struct file_class file_class, cdev_class, bdev_class, sock_class, unkn_class, fifo_class, +- nsfs_file_class, mqueue_file_class; ++ nsfs_file_class, mqueue_file_class, pidfs_file_class; + + /* + * IPC +@@ -307,4 +307,9 @@ bool is_mqueue_dev(dev_t dev); + */ + bool is_multiplexed_by_eventpoll(int fd, struct list_head *eventpolls); + ++/* ++ * Pidfs ++ */ ++bool is_pidfs_dev(dev_t dev); ++ + #endif /* UTIL_LINUX_LSFD_H */ +-- +2.45.0 + diff --git a/0004-lsfd-test-Adapt-test-cases-for-pidfs.patch b/0004-lsfd-test-Adapt-test-cases-for-pidfs.patch new file mode 100644 index 0000000..1d8b72e --- /dev/null +++ b/0004-lsfd-test-Adapt-test-cases-for-pidfs.patch @@ -0,0 +1,142 @@ +From: Xi Ruoyao +Date: Thu, 28 Mar 2024 04:01:02 +0800 +Subject: lsfd: test: Adapt test cases for pidfs +Git-repo: https://github.com/util-linux/util-linux.git +Git-commit: 04db2ba9008e9635286b1aafc8ecd9533a0a91bf +Patch-mainline: yes +References: kernel 6.9 + +On Linux >= 6.9, pidfds are from pidfs instead of anonymous inode. +Thus: + +STTYPE is REG on Linux >= 6.9, UNKN on Linux < 6.9. + +KNAME is pidfd:[inode number] on Linux >= 6.9, anon_inode:[pidfd] on +Linux < 6.9. + +And ainode_class test cannot work on Linux >= 6.9, just skip this sub +test if STTYPE is REG. + +Signed-off-by: Xi Ruoyao +Signed-off-by: Jiri Slaby +--- + tests/expected/lsfd/column-name-pidfd | 2 +- + tests/expected/lsfd/column-type-pidfd | 2 +- + tests/expected/lsfd/mkfds-pidfd | 2 +- + tests/ts/lsfd/column-ainodeclass | 8 ++++++++ + tests/ts/lsfd/column-name | 7 +++++++ + tests/ts/lsfd/column-type | 7 +++++++ + tests/ts/lsfd/mkfds-pidfd | 4 ++++ + 7 files changed, 29 insertions(+), 3 deletions(-) + +diff --git a/tests/expected/lsfd/column-name-pidfd b/tests/expected/lsfd/column-name-pidfd +index 10e3c5e7..68787d69 100644 +--- a/tests/expected/lsfd/column-name-pidfd ++++ b/tests/expected/lsfd/column-name-pidfd +@@ -1,2 +1,2 @@ +-3 anon_inode:[pidfd] pid=1 comm= nspid=1 ++3 [KNAME] pid=1 comm= nspid=1 + pidfd:ASSOC,KNAME,NAME: 0 +diff --git a/tests/expected/lsfd/column-type-pidfd b/tests/expected/lsfd/column-type-pidfd +index 6c9a9632..a4379807 100644 +--- a/tests/expected/lsfd/column-type-pidfd ++++ b/tests/expected/lsfd/column-type-pidfd +@@ -1,2 +1,2 @@ +-3 UNKN pidfd ++3 [STTYPE] pidfd + pidfd:ASSOC,STTYPE,TYPE: 0 +diff --git a/tests/expected/lsfd/mkfds-pidfd b/tests/expected/lsfd/mkfds-pidfd +index 94846992..bce4dd42 100644 +--- a/tests/expected/lsfd/mkfds-pidfd ++++ b/tests/expected/lsfd/mkfds-pidfd +@@ -1,2 +1,2 @@ +-3 UNKN anon_inodefs pid=1 comm=systemd nspid=1 systemd 1 ++3 [STTYPE] [SOURCE] pid=1 comm=systemd nspid=1 systemd 1 + ASSOC,STTYPE,SOURCE,NAME,PIDFD.COMM,PIDFD.PID: 0 +diff --git a/tests/ts/lsfd/column-ainodeclass b/tests/ts/lsfd/column-ainodeclass +index 6829494f..ab2abebd 100755 +--- a/tests/ts/lsfd/column-ainodeclass ++++ b/tests/ts/lsfd/column-ainodeclass +@@ -42,10 +42,18 @@ for C in pidfd inotify; do + fi + wait "${MKFDS_PID}" + } > "$TS_OUTPUT" 2>&1 ++ + if [ "$C-$?" == "pidfd-$TS_EXIT_NOTSUPP" ]; then + ts_skip_subtest "pidfd_open(2) is not available" + continue + fi ++ ++ STTYPE="$(head -n1 "$TS_OUTPUT" | awk '{print $2}')" ++ if [ "$C-$STTYPE" == "pidfd-REG" ]; then ++ ts_skip_subtest "pidfd is from pidfs instead of anon inode" ++ continue ++ fi ++ + ts_finalize_subtest + done + +diff --git a/tests/ts/lsfd/column-name b/tests/ts/lsfd/column-name +index 8bf8f421..9c67de88 100755 +--- a/tests/ts/lsfd/column-name ++++ b/tests/ts/lsfd/column-name +@@ -64,10 +64,17 @@ for C in ro-regular-file pidfd socketpair; do + fi + } > "$TS_OUTPUT" 2>&1 + wait "${MKFDS_PID}" ++ + if [ "$C-$?" == "pidfd-$TS_EXIT_NOTSUPP" ]; then + ts_skip_subtest "pidfd_open(2) is not available" + continue + fi ++ ++ case $C in ++ pidfd) ++ sed -i -E 's/(pidfd|anon_inode):\[[a-zA-Z]+\]/[KNAME]/' "$TS_OUTPUT" ++ esac ++ + ts_finalize_subtest + done + +diff --git a/tests/ts/lsfd/column-type b/tests/ts/lsfd/column-type +index 77bc5c94..1b8aa8c6 100755 +--- a/tests/ts/lsfd/column-type ++++ b/tests/ts/lsfd/column-type +@@ -50,10 +50,17 @@ for C in ro-regular-file pidfd inotify socketpair; do + fi + wait "${MKFDS_PID}" + } > "$TS_OUTPUT" 2>&1 ++ + if [ "$C-$?" == "pidfd-$TS_EXIT_NOTSUPP" ]; then + ts_skip_subtest "pidfd_open(2) is not available" + continue + fi ++ ++ case $C in ++ pidfd) ++ sed -i -E 's/UNKN|REG/[STTYPE]/' "$TS_OUTPUT" ++ esac ++ + ts_finalize_subtest + done + +diff --git a/tests/ts/lsfd/mkfds-pidfd b/tests/ts/lsfd/mkfds-pidfd +index c0fae4f7..9b0ff33c 100755 +--- a/tests/ts/lsfd/mkfds-pidfd ++++ b/tests/ts/lsfd/mkfds-pidfd +@@ -44,8 +44,12 @@ EXPR="(PID != ${TARGET}) and (FD == 3) and (PIDFD.PID == ${TARGET})" + fi + wait ${MKFDS_PID} + } > $TS_OUTPUT 2>&1 ++ + if [ "$?" == "$TS_EXIT_NOTSUPP" ]; then + ts_skip "pidfd_open(2) is not available" + fi + ++sed -i -E -e 's/UNKN|REG/[STTYPE]/' -e 's/pidfs|anon_inodefs/[SOURCE]/' \ ++ $TS_OUTPUT ++ + ts_finalize +-- +2.45.0 + diff --git a/util-linux.changes b/util-linux.changes index 4c6a7bf..f1d0630 100644 --- a/util-linux.changes +++ b/util-linux.changes @@ -1,3 +1,12 @@ +------------------------------------------------------------------- +Thu May 16 07:12:22 UTC 2024 - Jiri Slaby + +- add support for pidfs in kernel 6.9 (bsc#1224285) + * 0001-include-Include-unistd.h-in-pidfd-utils.h-for-syscal.patch + * 0002-lsfd-Refactor-the-pidfd-logic-into-lsfd-pidfd.c.patch + * 0003-lsfd-Support-pidfs.patch + * 0004-lsfd-test-Adapt-test-cases-for-pidfs.patch + ------------------------------------------------------------------- Wed May 8 14:06:51 UTC 2024 - Thorsten Kukuk diff --git a/util-linux.spec b/util-linux.spec index fce4065..6286d2a 100644 --- a/util-linux.spec +++ b/util-linux.spec @@ -111,6 +111,10 @@ Patch2: Add-documentation-on-blacklisted-modules-to-mount-8-.patch # PATCH-FIX-SUSE util-linux-bash-completion-su-chsh-l.patch bsc1172427 -- Fix "su -s" bash completion. Patch3: util-linux-bash-completion-su-chsh-l.patch Patch5: static_lib.patch +Patch6: 0001-include-Include-unistd.h-in-pidfd-utils.h-for-syscal.patch +Patch7: 0002-lsfd-Refactor-the-pidfd-logic-into-lsfd-pidfd.c.patch +Patch8: 0003-lsfd-Support-pidfs.patch +Patch9: 0004-lsfd-test-Adapt-test-cases-for-pidfs.patch BuildRequires: audit-devel BuildRequires: bc BuildRequires: binutils-devel