[packages/zfs] - upstream fix for krenels < 4.20, rel 2

baggins baggins at pld-linux.org
Sat Dec 14 16:28:20 CET 2024


commit 1d2c4ea649de3dbfd50a07ce2d764f8a2b4e21b6
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Sat Dec 14 15:51:22 2024 +0100

    - upstream fix for krenels < 4.20, rel 2

 dequeue_signal.patch | 130 +++++++++++++++++++++++++++++++++++++++++++++++++++
 zfs.spec             |   8 ++--
 2 files changed, 135 insertions(+), 3 deletions(-)
---
diff --git a/zfs.spec b/zfs.spec
index e1dd7c9..f11bdc0 100644
--- a/zfs.spec
+++ b/zfs.spec
@@ -24,7 +24,7 @@ exit 1
 
 %define		_duplicate_files_terminate_build	0
 
-%define	rel	1
+%define	rel	2
 %define	pname	zfs
 Summary:	Native Linux port of the ZFS filesystem
 Summary(pl.UTF-8):	Natywny linuksowy port systemu plików ZFS
@@ -37,6 +37,7 @@ Source0:	https://github.com/openzfs/zfs/releases/download/zfs-%{version}/%{pname
 # Source0-md5:	25d3e7afe00e04abe2c795cf644070af
 Patch0:		initdir.patch
 Patch1:		pld.patch
+Patch2:		dequeue_signal.patch
 URL:		https://zfsonlinux.org/
 BuildRequires:	autoconf >= 2.50
 BuildRequires:	automake
@@ -259,8 +260,9 @@ p=`pwd`\
 
 %prep
 %setup -q -n %{pname}-%{version}
-%patch0 -p1
-%patch1 -p1
+%patch -P 0 -p1
+%patch -P 1 -p1
+%patch -P 2 -p1
 
 %{__sed} -E -i -e '1s,#!\s*/usr/bin/env\s+python3(\s|$),#!%{__python3}\1,' \
 	cmd/arc_summary
diff --git a/dequeue_signal.patch b/dequeue_signal.patch
new file mode 100644
index 0000000..78c2bce
--- /dev/null
+++ b/dequeue_signal.patch
@@ -0,0 +1,130 @@
+From 21cba06befe98abe99c07b5827ca364836bcd17d Mon Sep 17 00:00:00 2001
+From: Rob Norris <robn at despairlabs.com>
+Date: Mon, 21 Oct 2024 13:50:13 +1100
+Subject: [PATCH] config: fix dequeue_signal check for kernels <4.20
+
+Before 4.20, kernel_siginfo_t was just called siginfo_t. This was
+causing the kthread_dequeue_signal_3arg_task check, which uses
+kernel_siginfo_t, to fail on older kernels.
+
+In d6b8c17f1, we started checking for the "new" three-arg
+dequeue_signal() by testing for the "old" version. Because that test is
+explicitly using kernel_siginfo_t, it would fail, leading to the build
+trying to use the new three-arg version, which would then not compile.
+
+This commit fixes that by avoiding checking for the old 3-arg
+dequeue_signal entirely. Instead, we check for the new one, as well as
+the 4-arg form, and we use the old form as a fallback. This way, we
+never have to test for it explicitly, and once we're building
+HAVE_SIGINFO will make sure we get the right kernel_siginfo_t for it, so
+everything works out nice.
+
+Original-patch-by: Finix <yancw at info2soft.com>
+Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
+Signed-off-by: Rob Norris <robn at despairlabs.com>
+Closes #16666
+---
+ config/kernel-kthread.m4         | 37 +++++++++++++++++++-------------
+ module/os/linux/spl/spl-thread.c |  6 +++---
+ 2 files changed, 25 insertions(+), 18 deletions(-)
+
+diff --git a/config/kernel-kthread.m4 b/config/kernel-kthread.m4
+index 4d580efead6b..607953146323 100644
+--- a/config/kernel-kthread.m4
++++ b/config/kernel-kthread.m4
+@@ -17,14 +17,21 @@ AC_DEFUN([ZFS_AC_KERNEL_KTHREAD_COMPLETE_AND_EXIT], [
+ 
+ AC_DEFUN([ZFS_AC_KERNEL_KTHREAD_DEQUEUE_SIGNAL], [
+ 	dnl #
+-	dnl # 5.17 API: enum pid_type * as new 4th dequeue_signal() argument,
+-	dnl # 5768d8906bc23d512b1a736c1e198aa833a6daa4 ("signal: Requeue signals in the appropriate queue")
++	dnl # prehistory:
++	dnl #     int dequeue_signal(struct task_struct *task, sigset_t *mask,
++	dnl #         siginfo_t *info)
+ 	dnl #
+-	dnl # int dequeue_signal(struct task_struct *task, sigset_t *mask, kernel_siginfo_t *info);
+-	dnl # int dequeue_signal(struct task_struct *task, sigset_t *mask, kernel_siginfo_t *info, enum pid_type *type);
++	dnl # 4.20: kernel_siginfo_t introduced, replaces siginfo_t
++	dnl #     int dequeue_signal(struct task_struct *task, sigset_t *mask,
++	dnl           kernel_siginfo_t *info)
+ 	dnl #
+-	dnl # 6.12 API: first arg struct_task* removed
+-	dnl # int dequeue_signal(sigset_t *mask, kernel_siginfo_t *info, enum pid_type *type);
++	dnl # 5.17: enum pid_type introduced as 4th arg
++	dnl #     int dequeue_signal(struct task_struct *task, sigset_t *mask,
++	dnl #         kernel_siginfo_t *info, enum pid_type *type)
++	dnl #
++	dnl # 6.12: first arg struct_task* removed
++	dnl #     int dequeue_signal(sigset_t *mask, kernel_siginfo_t *info,
++	dnl #         enum pid_type *type)
+ 	dnl #
+ 	AC_MSG_CHECKING([whether dequeue_signal() takes 4 arguments])
+ 	ZFS_LINUX_TEST_RESULT([kthread_dequeue_signal_4arg], [
+@@ -33,11 +40,11 @@ AC_DEFUN([ZFS_AC_KERNEL_KTHREAD_DEQUEUE_SIGNAL], [
+ 		    [dequeue_signal() takes 4 arguments])
+ 	], [
+ 		AC_MSG_RESULT(no)
+-		AC_MSG_CHECKING([whether dequeue_signal() a task argument])
+-		ZFS_LINUX_TEST_RESULT([kthread_dequeue_signal_3arg_task], [
++		AC_MSG_CHECKING([whether 3-arg dequeue_signal() takes a type argument])
++		ZFS_LINUX_TEST_RESULT([kthread_dequeue_signal_3arg_type], [
+ 			AC_MSG_RESULT(yes)
+-			AC_DEFINE(HAVE_DEQUEUE_SIGNAL_3ARG_TASK, 1,
+-			    [dequeue_signal() takes a task argument])
++			AC_DEFINE(HAVE_DEQUEUE_SIGNAL_3ARG_TYPE, 1,
++			    [3-arg dequeue_signal() takes a type argument])
+ 		], [
+ 			AC_MSG_RESULT(no)
+ 		])
+@@ -56,27 +63,27 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_KTHREAD_COMPLETE_AND_EXIT], [
+ ])
+ 
+ AC_DEFUN([ZFS_AC_KERNEL_SRC_KTHREAD_DEQUEUE_SIGNAL], [
+-	ZFS_LINUX_TEST_SRC([kthread_dequeue_signal_3arg_task], [
++	ZFS_LINUX_TEST_SRC([kthread_dequeue_signal_4arg], [
+ 		#include <linux/sched/signal.h>
+ 	], [
+ 		struct task_struct *task = NULL;
+ 		sigset_t *mask = NULL;
+ 		kernel_siginfo_t *info = NULL;
++		enum pid_type *type = NULL;
+ 		int error __attribute__ ((unused));
+ 
+-		error = dequeue_signal(task, mask, info);
++		error = dequeue_signal(task, mask, info, type);
+ 	])
+ 
+-	ZFS_LINUX_TEST_SRC([kthread_dequeue_signal_4arg], [
++	ZFS_LINUX_TEST_SRC([kthread_dequeue_signal_3arg_type], [
+ 		#include <linux/sched/signal.h>
+ 	], [
+-		struct task_struct *task = NULL;
+ 		sigset_t *mask = NULL;
+ 		kernel_siginfo_t *info = NULL;
+ 		enum pid_type *type = NULL;
+ 		int error __attribute__ ((unused));
+ 
+-		error = dequeue_signal(task, mask, info, type);
++		error = dequeue_signal(mask, info, type);
+ 	])
+ ])
+ 
+diff --git a/module/os/linux/spl/spl-thread.c b/module/os/linux/spl/spl-thread.c
+index 7f74d44f91ff..7b0ce30c7884 100644
+--- a/module/os/linux/spl/spl-thread.c
++++ b/module/os/linux/spl/spl-thread.c
+@@ -171,11 +171,11 @@ issig(void)
+ #if defined(HAVE_DEQUEUE_SIGNAL_4ARG)
+ 	enum pid_type __type;
+ 	if (dequeue_signal(current, &set, &__info, &__type) != 0) {
+-#elif defined(HAVE_DEQUEUE_SIGNAL_3ARG_TASK)
+-	if (dequeue_signal(current, &set, &__info) != 0) {
+-#else
++#elif defined(HAVE_DEQUEUE_SIGNAL_3ARG_TYPE)
+ 	enum pid_type __type;
+ 	if (dequeue_signal(&set, &__info, &__type) != 0) {
++#else
++	if (dequeue_signal(current, &set, &__info) != 0) {
+ #endif
+ 		spin_unlock_irq(&current->sighand->siglock);
+ 		kernel_signal_stop();
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/zfs.git/commitdiff/1d2c4ea649de3dbfd50a07ce2d764f8a2b4e21b6



More information about the pld-cvs-commit mailing list