From nobody Sun Feb 8 08:48:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3E05C299AAF; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; cv=none; b=K8woLtn+a1yWRMhqK41DRE9YHB2LDFlcrZJh8HiXpw2fUeHCSL100CfrMTb5WTJSjwT6rPseHOsyyKhXtM4PXNiteXUsIsAaZeLjKZTRrxfNEgpwrWD8ZUYmjCuH3SLvaEBkUmfHZxsA7NYiz0u0sOtP5d+tHMUcgjDGseBmZ4Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; c=relaxed/simple; bh=62Ezf+MMoxaxr6Uds+Kh8ORxtthu1fTbCWYlsyLGDk0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jh/+TmG3PjyaO8NWJiK6B5QW4LCle8thGG1OULN7JY1aIVkJo6epa9uNmjkjPO6/3EWnJE8YuaTa2f2d4s+FhJGXPbf44FifZlkY+Hl+xJI8uh46tcgjO5t5gVh85CzHy1zIOqKtC7BAg5MRPMz777XhSmythlR+wTwmn99gPmY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UuNhT99h; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UuNhT99h" Received: by smtp.kernel.org (Postfix) with ESMTPS id A0198C4CEFE; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760689989; bh=62Ezf+MMoxaxr6Uds+Kh8ORxtthu1fTbCWYlsyLGDk0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=UuNhT99hd4VHpYVGyyRQqIkt9AmpOi7TQeolzf4FVFo3rmwySwJx2Tax+UJnd5n3o 45ihYDTb9jQAiDPusHtmoRXRzQgvNd22kNVIP+K3+DN0Driki9ynDpz0fYC0ZutfWl jlPX+DduRl0ruEVI3swq0aFF4sGKiIOGNQR1UUfF9+X6WpSOKz3uJnALMt9nn2wn6Z druwbjy8bVPbwUY6J3s4owXkUO6X+nDk3WTnFnsY5G9UGk23O87mWK+ruC/RjnarZN ohX0CDQnUU0lXaa9rpig1aibih1/R1sXUeM/toi44D2iQsZsDrfkaUHGlImLBmzQwP g+GBoFhJW6+ZQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8BF5DCCD195; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) From: Joel Granados Date: Fri, 17 Oct 2025 10:32:11 +0200 Subject: [PATCH 1/7] sysctl: Allow custom converters from outside sysctl Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251017-jag-sysctl_jiffies-v1-1-175d81dfdf82@kernel.org> References: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> In-Reply-To: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4391; i=joel.granados@kernel.org; h=from:subject:message-id; bh=62Ezf+MMoxaxr6Uds+Kh8ORxtthu1fTbCWYlsyLGDk0=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGjx/z9NEUgQEQzHTjm/71z/VPH7DVf7miKo+ MtN5Ieh8pkeJIkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJo8f8/AAoJELqXzVK3 lkFPmAsL/RydnP2jRvrlF7N38ELiPG1k6N7zk5JbfzgLHYglKH48TywEaONCNKqjyi5NHm4pKKw GwVZ0BsDYsDTi4xEDDhIqjF3b7afOzlZc9zw+GEbLtgvlVzEcIBgc/63G4eNm7eiCP4tR6VIjGz YR4I7gbZx4kjCL+ZytQTr7yRTmVVQPn3S0TdEKBSjf+dFcyJ4bJxhXVBJ/Yq1Qv5EpF2ibcHowG 5RXXAs/8E5YohVPmyJN8DifO5lw8/am7+jkLJiwNC8pc0Lotus9A3pBvT73me0oobWXEm8NIpzO qK3MZVmc7chn1SNyJ/aFB7r8SoR4xyp8+4ecmGH1iiOgCr1wmRq0t94NX4e7cFPrHlzMsuA0w7V 95FdJVR4hohx7TpQ3+n2LnzleV8xfaz4J9yuiAJLyynu3cHOx1hCkzQW8fWMAnDyLovq0q/7hxn LBeze2V4Qv6vmWk1VsMaO6z2VV5y20zB0+xeYykMBmBUB4ZD7BE6gsDoVZlkcfA9S8FHi7R+VQ5 sk= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 The new non-static proc_dointvec_conv forwards a custom converter function to do_proc_dointvec from outside the sysctl scope. Rename the do_proc_dointvec call points so any future changes to proc_dointvec_conv are propagated in sysctl.c This is a preparation commit that allows the integer jiffie converter functions to move out of kernel/sysctl.c. Signed-off-by: Joel Granados --- include/linux/sysctl.h | 4 ++++ kernel/sysctl.c | 32 ++++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 2d3d6c141b0b0aee21f2708450b7b41d8041a8cb..ecc8d2345006ab12520f2f6ec37= 379419e9295d4 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -68,6 +68,10 @@ int proc_dostring(const struct ctl_table *, int, void *,= size_t *, loff_t *); int proc_dobool(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos); int proc_dointvec(const struct ctl_table *, int, void *, size_t *, loff_t = *); +int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffe= r, + size_t *lenp, loff_t *ppos, + int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, + int dir, const struct ctl_table *table)); int proc_douintvec(const struct ctl_table *, int, void *, size_t *, loff_t= *); int proc_dointvec_minmax(const struct ctl_table *, int, void *, size_t *, = loff_t *); int proc_douintvec_minmax(const struct ctl_table *table, int write, void *= buffer, diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 55d12d22a3cc476c6595b50100eef53251dac80a..6a6a2a6421f8debf75089548c82= 374619af32d61 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1005,6 +1005,14 @@ int proc_doulongvec_ms_jiffies_minmax(const struct c= tl_table *table, int dir, lenp, ppos, HZ, 1000l); } =20 +int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffe= r, + size_t *lenp, loff_t *ppos, + int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, + int dir, const struct ctl_table *table)) +{ + return do_proc_dointvec(table, dir, buffer, lenp, ppos, conv); +} + /** * proc_dointvec_jiffies - read a vector of integers as seconds * @table: the sysctl table @@ -1023,15 +1031,15 @@ int proc_doulongvec_ms_jiffies_minmax(const struct = ctl_table *table, int dir, int proc_dointvec_jiffies(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_dointvec(table, dir, buffer, lenp, ppos, - do_proc_int_conv_jiffies); + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, + do_proc_int_conv_jiffies); } =20 int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_dointvec(table, dir, buffer, lenp, ppos, - do_proc_int_conv_ms_jiffies_minmax); + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, + do_proc_int_conv_ms_jiffies_minmax); } =20 /** @@ -1054,8 +1062,8 @@ int proc_dointvec_userhz_jiffies(const struct ctl_tab= le *table, int dir, { if (USER_HZ < HZ) return -EINVAL; - return do_proc_dointvec(table, dir, buffer, lenp, ppos, - do_proc_int_conv_userhz_jiffies); + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, + do_proc_int_conv_userhz_jiffies); } =20 /** @@ -1076,8 +1084,8 @@ int proc_dointvec_userhz_jiffies(const struct ctl_tab= le *table, int dir, int proc_dointvec_ms_jiffies(const struct ctl_table *table, int dir, void = *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_dointvec(table, dir, buffer, lenp, ppos, - do_proc_int_conv_ms_jiffies); + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, + do_proc_int_conv_ms_jiffies); } =20 /** @@ -1307,6 +1315,14 @@ int proc_doulongvec_ms_jiffies_minmax(const struct c= tl_table *table, int dir, return -ENOSYS; } =20 +int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffe= r, + size_t *lenp, loff_t *ppos, + int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, + int dir, const struct ctl_table *table)) +{ + return -ENOSYS; +} + int proc_do_large_bitmap(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { --=20 2.50.1 From nobody Sun Feb 8 08:48:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4093E296BB4; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; cv=none; b=SrNFhgqFxkSEmYS2mWibMwMlc62NLM68G9hDyvYaXebDYPIvoupvu+Xt214UX91CzDrgMgtL2iHd8RGfweA+a/Uj1Kx7U/guR4kA81DV+M/va4IoqB26rjHMdasLAiE+Bwr0E6UVPUD+sBrTOXhDAktCUKVM/3sPWCT00+YQ/Ck= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; c=relaxed/simple; bh=q9gCEt3TobxYIVG/KkXiEJcB2H0/1WMYfGIpn+5weUg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Vd7sIx/MzCGcGAZkWgILMvC1R8iXWfDzGcRby8w/1E9pMJnMBblHYh3XX8Yh7g0lWy+acBITGuHonYOiPtXJwXqIt2jngCpsbfbm0hNYaUK9wsGx31x8jact1wC3R86oycCtdArfGfv4T0PlH3VvJyDPRo7HdtE8q3apJCtQ8gE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZYnEbO00; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="ZYnEbO00" Received: by smtp.kernel.org (Postfix) with ESMTPS id B2E0BC4AF0B; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760689989; bh=q9gCEt3TobxYIVG/KkXiEJcB2H0/1WMYfGIpn+5weUg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=ZYnEbO005LHWApfem2/aQ2uxZb2K8u/Lq7gEyVG/z3eu47EMZJdsb2XuCzbSZ6yhB WSZ93P/VH+C6c0KTO2KMz1+YNPsNNcX2LhUfLx/Z851GxOtnroZ/C/B26uv/BqsaYs 7Rgj8iWSR2B1S4JhS3JGDTIyeXwhvKPQnDuPdt1l8tLZe3EA4pzP0VMEfy2WYzemFF xJaNL8ZG24KW9a5mG3MiGHhgGqY55S1PqPdsO1XnvV9FzuXMYksMElRrbqx8/39uF/ EnN8jsEzBbywPBcFz2VeYaUiH3ZvKXWfMrWuF/xTyDHoTsyo4vUDTDn7IAWzOD3Ifb atp8DaDasIukQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 99DD0CCD1A2; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) From: Joel Granados Date: Fri, 17 Oct 2025 10:32:12 +0200 Subject: [PATCH 2/7] sysctl: Move INT converter macros to sysctl header Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251017-jag-sysctl_jiffies-v1-2-175d81dfdf82@kernel.org> References: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> In-Reply-To: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6756; i=joel.granados@kernel.org; h=from:subject:message-id; bh=q9gCEt3TobxYIVG/KkXiEJcB2H0/1WMYfGIpn+5weUg=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGjx/z/0VfSrjs8ZqAKxT/Y+E4PCmvOw6GQNu ejTJLH8jMKR/4kBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJo8f8/AAoJELqXzVK3 lkFPWN0L/ApKAqufgi2A8tK0k/fE1WyNBqIg6r3rpZiwzAr+CWfMLXdsWpBPmghF1W8X5jRjL9F IrzSWsPN/VIvu3Vak73VDgzyc7JsjAkaT3s+bD1sjjz2zaIs2ZVG4R+y9muSLIvkfTGXqqEyO3T trdthVFKLhrpLjmSzBnGCz5+wuHk5cVJfYbsa9BRh1bOxO2WZtw/bNT8KTjxUMIUVkbnQuCtcW2 LrzsUqd6hidWEPn3BQ91FIq6DjWaMJxV/H4OPauJpUo5sX00ubuzIOt+DqKf2pSvYkaXPC3hWN6 sA5hxz6zjy+Bp0iBgwNR5Y/7xi/4AO66q6rzAYRscPAJXtvsBG0mJ5e/7R6YyRc66Pgf4z9kMqJ opB5PzBdo0IBbZtWJmyScipVRbKxIzx2pDMkMqwzZ2hLposPrLEpCtPYfwHeFOfiwno6rRCm/+J ShLTGkiR66ddGtxfIA2ioWXv0u/mIh4pJ8MSX4aDDQwziho1z3+M7n4C2AoviWR/ugX05sFuW3+ PM= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Move direction macros (SYSCTL_{USER_TO_KERN,KERN_TO_USER}) and the integer converter macros (SYSCTL_{USER_TO_KERN,KERN_TO_USER}_INT_CONV, SYSCTL_INT_CONV_CUSTOM) into include/linux/sysctl.h. This is a preparation commit to enable jiffies converter creation outside kernel/sysctl.c. Signed-off-by: Joel Granados --- include/linux/sysctl.h | 75 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ kernel/sysctl.c | 75 ----------------------------------------------= ---- 2 files changed, 75 insertions(+), 75 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index ecc8d2345006ab12520f2f6ec37379419e9295d4..967a9ad6b4200266e2d9c6cfa9e= e58fb8bf51090 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -59,6 +59,81 @@ extern const int sysctl_vals[]; #define SYSCTL_LONG_ONE ((void *)&sysctl_long_vals[1]) #define SYSCTL_LONG_MAX ((void *)&sysctl_long_vals[2]) =20 +/** + * + * "dir" originates from read_iter (dir =3D 0) or write_iter (dir =3D 1) + * in the file_operations struct at proc/proc_sysctl.c. Its value means + * one of two things for sysctl: + * 1. SYSCTL_USER_TO_KERN(dir) Writing to an internal kernel variable from= user + * space (dir > 0) + * 2. SYSCTL_KERN_TO_USER(dir) Writing to a user space buffer from a kernel + * variable (dir =3D=3D 0). + */ +#define SYSCTL_USER_TO_KERN(dir) (!!(dir)) +#define SYSCTL_KERN_TO_USER(dir) (!dir) + +#define SYSCTL_USER_TO_KERN_INT_CONV(name, u_ptr_op) \ +int sysctl_user_to_kern_int_conv##name(const bool *negp, \ + const unsigned long *u_ptr,\ + int *k_ptr) \ +{ \ + unsigned long u =3D u_ptr_op(*u_ptr); \ + if (*negp) { \ + if (u > (unsigned long) INT_MAX + 1) \ + return -EINVAL; \ + WRITE_ONCE(*k_ptr, -u); \ + } else { \ + if (u > (unsigned long) INT_MAX) \ + return -EINVAL; \ + WRITE_ONCE(*k_ptr, u); \ + } \ + return 0; \ +} + +#define SYSCTL_KERN_TO_USER_INT_CONV(name, k_ptr_op) \ +int sysctl_kern_to_user_int_conv##name(bool *negp, \ + unsigned long *u_ptr, \ + const int *k_ptr) \ +{ \ + int val =3D READ_ONCE(*k_ptr); \ + if (val < 0) { \ + *negp =3D true; \ + *u_ptr =3D -k_ptr_op((unsigned long)val); \ + } else { \ + *negp =3D false; \ + *u_ptr =3D k_ptr_op((unsigned long)val); \ + } \ + return 0; \ +} + +/** + * To range check on a converted value, use a temp k_ptr + * When checking range, value should be within (tbl->extra1, tbl->extra2) + */ +#define SYSCTL_INT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ + k_ptr_range_check) \ +int do_proc_int_conv##name(bool *negp, unsigned long *u_ptr, int *k_ptr,\ + int dir, const struct ctl_table *tbl) \ +{ \ + if (SYSCTL_KERN_TO_USER(dir)) \ + return kern_to_user(negp, u_ptr, k_ptr); \ + \ + if (k_ptr_range_check) { \ + int tmp_k, ret; \ + if (!tbl) \ + return -EINVAL; \ + ret =3D user_to_kern(negp, u_ptr, &tmp_k); \ + if (ret) \ + return ret; \ + if ((tbl->extra1 && *(int *)tbl->extra1 > tmp_k) || \ + (tbl->extra2 && *(int *)tbl->extra2 < tmp_k)) \ + return -EINVAL; \ + WRITE_ONCE(*k_ptr, tmp_k); \ + } else \ + return user_to_kern(negp, u_ptr, k_ptr); \ + return 0; \ +} + extern const unsigned long sysctl_long_vals[]; =20 typedef int proc_handler(const struct ctl_table *ctl, int write, void *buf= fer, diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 6a6a2a6421f8debf75089548c82374619af32d61..70cf23d9834ef4e6b95ab80a3dc= 7a06237742793 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -30,19 +30,6 @@ EXPORT_SYMBOL(sysctl_vals); const unsigned long sysctl_long_vals[] =3D { 0, 1, LONG_MAX }; EXPORT_SYMBOL_GPL(sysctl_long_vals); =20 -/** - * - * "dir" originates from read_iter (dir =3D 0) or write_iter (dir =3D 1) - * in the file_operations struct at proc/proc_sysctl.c. Its value means - * one of two things for sysctl: - * 1. SYSCTL_USER_TO_KERN(dir) Writing to an internal kernel variable from= user - * space (dir > 0) - * 2. SYSCTL_KERN_TO_USER(dir) Writing to a user space buffer from a kernel - * variable (dir =3D=3D 0). - */ -#define SYSCTL_USER_TO_KERN(dir) (!!(dir)) -#define SYSCTL_KERN_TO_USER(dir) (!dir) - #if defined(CONFIG_SYSCTL) =20 /* Constants used for minimum and maximum */ @@ -368,68 +355,6 @@ static void proc_put_char(void **buf, size_t *size, ch= ar c) } } =20 -#define SYSCTL_USER_TO_KERN_INT_CONV(name, u_ptr_op) \ -int sysctl_user_to_kern_int_conv##name(const bool *negp, \ - const unsigned long *u_ptr,\ - int *k_ptr) \ -{ \ - unsigned long u =3D u_ptr_op(*u_ptr); \ - if (*negp) { \ - if (u > (unsigned long) INT_MAX + 1) \ - return -EINVAL; \ - WRITE_ONCE(*k_ptr, -u); \ - } else { \ - if (u > (unsigned long) INT_MAX) \ - return -EINVAL; \ - WRITE_ONCE(*k_ptr, u); \ - } \ - return 0; \ -} - -#define SYSCTL_KERN_TO_USER_INT_CONV(name, k_ptr_op) \ -int sysctl_kern_to_user_int_conv##name(bool *negp, \ - unsigned long *u_ptr, \ - const int *k_ptr) \ -{ \ - int val =3D READ_ONCE(*k_ptr); \ - if (val < 0) { \ - *negp =3D true; \ - *u_ptr =3D -k_ptr_op((unsigned long)val); \ - } else { \ - *negp =3D false; \ - *u_ptr =3D k_ptr_op((unsigned long)val); \ - } \ - return 0; \ -} - -/** - * To range check on a converted value, use a temp k_ptr - * When checking range, value should be within (tbl->extra1, tbl->extra2) - */ -#define SYSCTL_INT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ - k_ptr_range_check) \ -int do_proc_int_conv##name(bool *negp, unsigned long *u_ptr, int *k_ptr,\ - int dir, const struct ctl_table *tbl) \ -{ \ - if (SYSCTL_KERN_TO_USER(dir)) \ - return kern_to_user(negp, u_ptr, k_ptr); \ - \ - if (k_ptr_range_check) { \ - int tmp_k, ret; \ - if (!tbl) \ - return -EINVAL; \ - ret =3D user_to_kern(negp, u_ptr, &tmp_k); \ - if (ret) \ - return ret; \ - if ((tbl->extra1 && *(int *)tbl->extra1 > tmp_k) || \ - (tbl->extra2 && *(int *)tbl->extra2 < tmp_k)) \ - return -EINVAL; \ - WRITE_ONCE(*k_ptr, tmp_k); \ - } else \ - return user_to_kern(negp, u_ptr, k_ptr); \ - return 0; \ -} - #define SYSCTL_CONV_IDENTITY(val) val #define SYSCTL_CONV_MULT_HZ(val) ((val) * HZ) #define SYSCTL_CONV_DIV_HZ(val) ((val) / HZ) --=20 2.50.1 From nobody Sun Feb 8 08:48:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 43A9129ACC2; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; cv=none; b=cdCKIsG9+tCs/DG/Qtxc8t8kQRt9qYHpQ9UskdzGeiT+LnyuOpKT6wYmKQo6vBnygtHwGgKD6qoGhRAd/r+pG0X5q0bC0gHaRIuJuNnq/VRpBTfh5D5orbdN49yIybHJ1W3B52Fkty+u9seNqh8O+liJKMJUAzfac+xgJ+YOwqQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; c=relaxed/simple; bh=0OjnJiYGVGjDynjvHn5XLycsIiIb+BowncnpR4xepGI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NZ88d6816xs4pVQfE3Q8a0cxtZWBCv9diP3/tOyeoP1AsvOhnFmA5DEV8C93JDKeCiGXibWrYDLDYIcwlQ7uif8nmOsk9sHYLdBvBQwkv2OUcBXTRqABeQpLLb29cyf63BqWMmrExoccbTUMxkLfNM9S3zUtHGUx1aWicVR6cW8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nbQXgI29; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nbQXgI29" Received: by smtp.kernel.org (Postfix) with ESMTPS id B64DEC116D0; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760689989; bh=0OjnJiYGVGjDynjvHn5XLycsIiIb+BowncnpR4xepGI=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=nbQXgI29aKdZ0gLT+eeqI5vO8WPTdbmrZjJc8HTPN0qg8L777twrVXxcSnAEzpge9 b8iEHtWEVkaEDzNkjy9PGYDx76Twff3cbFgkHl4RA3dv/vgZNNeBEYkiNN66TznsyS u/tnaaLIlnvBOnLyS+MnbB5ZCePIHrqUwl8LnbWeBdQQFt8ocPy3O9gYUunDnUgDZC hvLW9tQiptn2WZ5H54sHa9wbEhDXs7ecUIc6roNWtDuRuqghAQc/xfQ4ihBDV8rZjv 39RSUyJDcg+4BxXal0IXUfS37BjFyNPR/c3tnyS57AcRdamVWB7IBJycYE6yTup5wJ 4GWBZ7c+6BRNw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id A6F67CCD184; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) From: Joel Granados Date: Fri, 17 Oct 2025 10:32:13 +0200 Subject: [PATCH 3/7] sysctl: Move UINT converter macros to sysctl header Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251017-jag-sysctl_jiffies-v1-3-175d81dfdf82@kernel.org> References: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> In-Reply-To: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4816; i=joel.granados@kernel.org; h=from:subject:message-id; bh=0OjnJiYGVGjDynjvHn5XLycsIiIb+BowncnpR4xepGI=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGjx/0CUvvVn2u5K8hSOidQ/tDLn/ZoBkO+Mf 0DOFi4952J0DokBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJo8f9AAAoJELqXzVK3 lkFPlDcL/iVvo3C3ne1X/TP/Nwgr9Idr+QgPEHWWfWOc7zUnd9gFUw/tl1gLDygH1DOSl1ohxUF JFT4T5+Nvdze/bHjcHa7vrqLE4Sr09Gx/wCPGfEyagT5FLDhbeYwp3MigtDewKIS/nDkdGe9Zle y5LxmjxXIEYeTbog9nQjHktf2hDCXHy77VKEK+5Kys7lSneyVOizQErYE/iZMEOuLywD9Hzj4GM +OdWfigmzBmwcBFrYcNiU3BLhaNGuFRxKBPPgXiQjHdKovUgSwItAXLPPCvfhdtyqPzWSm7+BYa X9WPucQ2LtJfhj742AnnQZ4ZH71obLXEGpesNbgyV9djwBLTbzRPr3fw/OlEMyZX+Yc5SJ+kO8t TU1j226NZkPvpx0ILKWvaBT+rgppdaZ5ymapxE73tIDIQetdWn4SlmDMQYg9y4kCKNp/RmgUp76 GtJnIs+fN57v/UO6M1m5cnBzRnfyJ90LzXEgWPMzuxaL/gq6oNQmYbx8eCGW8/dq1Wzc0LaPBb5 0o= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Move SYSCTL_USER_TO_KERN_UINT_CONV and SYSCTL_UINT_CONV_CUSTOM macros to include/linux/sysctl.h. No need to embed sysctl_kern_to_user_uint_conv in a macro as it will not need a custom kernel pointer operation. This is a preparation commit to enable jiffies converter creation outside kernel/sysctl.c. Signed-off-by: Joel Granados --- include/linux/sysctl.h | 40 ++++++++++++++++++++++++++++++++++++++++ kernel/sysctl.c | 42 ++---------------------------------------- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 967a9ad6b4200266e2d9c6cfa9ee58fb8bf51090..faeeb2feefb83d5b57e67f5cbf2= eadf79dd03fb2 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -134,6 +134,45 @@ int do_proc_int_conv##name(bool *negp, unsigned long *= u_ptr, int *k_ptr,\ return 0; \ } =20 +#define SYSCTL_USER_TO_KERN_UINT_CONV(name, u_ptr_op) \ +int sysctl_user_to_kern_uint_conv##name(const unsigned long *u_ptr,\ + unsigned int *k_ptr) \ +{ \ + unsigned long u =3D u_ptr_op(*u_ptr); \ + if (u > UINT_MAX) \ + return -EINVAL; \ + WRITE_ONCE(*k_ptr, u); \ + return 0; \ +} + +#define SYSCTL_UINT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ + k_ptr_range_check) \ +int do_proc_uint_conv##name(unsigned long *u_ptr, unsigned int *k_ptr, \ + int dir, const struct ctl_table *tbl) \ +{ \ + if (SYSCTL_KERN_TO_USER(dir)) \ + return kern_to_user(u_ptr, k_ptr); \ + \ + if (k_ptr_range_check) { \ + unsigned int tmp_k; \ + int ret; \ + if (!tbl) \ + return -EINVAL; \ + ret =3D user_to_kern(u_ptr, &tmp_k); \ + if (ret) \ + return ret; \ + if ((tbl->extra1 && \ + *(unsigned int *)tbl->extra1 > tmp_k) || \ + (tbl->extra2 && \ + *(unsigned int *)tbl->extra2 < tmp_k)) \ + return -ERANGE; \ + WRITE_ONCE(*k_ptr, tmp_k); \ + } else \ + return user_to_kern(u_ptr, k_ptr); \ + return 0; \ +} + + extern const unsigned long sysctl_long_vals[]; =20 typedef int proc_handler(const struct ctl_table *ctl, int write, void *buf= fer, @@ -166,6 +205,7 @@ int proc_doulongvec_ms_jiffies_minmax(const struct ctl_= table *table, int, void * int proc_do_large_bitmap(const struct ctl_table *, int, void *, size_t *, = loff_t *); int proc_do_static_key(const struct ctl_table *table, int write, void *buf= fer, size_t *lenp, loff_t *ppos); +int sysctl_kern_to_user_uint_conv(unsigned long *u_ptr, const unsigned int= *k_ptr); =20 /* * Register a set of sysctl names by calling register_sysctl diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 70cf23d9834ef4e6b95ab80a3dc7a06237742793..f3d2385f88494da1e5ba7ee1fbb= 575d2545d7d84 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -387,54 +387,16 @@ static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies_minmax, sysctl_user_to_kern_int_conv_ms, sysctl_kern_to_user_int_conv_ms, true) =20 -#define SYSCTL_USER_TO_KERN_UINT_CONV(name, u_ptr_op) \ -int sysctl_user_to_kern_uint_conv##name(const unsigned long *u_ptr,\ - unsigned int *k_ptr) \ -{ \ - unsigned long u =3D u_ptr_op(*u_ptr); \ - if (u > UINT_MAX) \ - return -EINVAL; \ - WRITE_ONCE(*k_ptr, u); \ - return 0; \ -} - static SYSCTL_USER_TO_KERN_UINT_CONV(,SYSCTL_CONV_IDENTITY) =20 -static int sysctl_kern_to_user_uint_conv(unsigned long *u_ptr, - const unsigned int *k_ptr) +int sysctl_kern_to_user_uint_conv(unsigned long *u_ptr, + const unsigned int *k_ptr) { unsigned int val =3D READ_ONCE(*k_ptr); *u_ptr =3D (unsigned long)val; return 0; } =20 -#define SYSCTL_UINT_CONV_CUSTOM(name, user_to_kern, kern_to_user, \ - k_ptr_range_check) \ -int do_proc_uint_conv##name(unsigned long *u_ptr, unsigned int *k_ptr, \ - int dir, const struct ctl_table *tbl) \ -{ \ - if (SYSCTL_KERN_TO_USER(dir)) \ - return kern_to_user(u_ptr, k_ptr); \ - \ - if (k_ptr_range_check) { \ - unsigned int tmp_k; \ - int ret; \ - if (!tbl) \ - return -EINVAL; \ - ret =3D user_to_kern(u_ptr, &tmp_k); \ - if (ret) \ - return ret; \ - if ((tbl->extra1 && \ - *(unsigned int *)tbl->extra1 > tmp_k) || \ - (tbl->extra2 && \ - *(unsigned int *)tbl->extra2 < tmp_k)) \ - return -ERANGE; \ - WRITE_ONCE(*k_ptr, tmp_k); \ - } else \ - return user_to_kern(u_ptr, k_ptr); \ - return 0; \ -} - static SYSCTL_UINT_CONV_CUSTOM(, sysctl_user_to_kern_uint_conv, sysctl_kern_to_user_uint_conv, false) static SYSCTL_UINT_CONV_CUSTOM(_minmax, sysctl_user_to_kern_uint_conv, --=20 2.50.1 From nobody Sun Feb 8 08:48:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A348B29D27D; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; cv=none; b=IrIDsuMV/E2uigHmMCHl8gdgy6MxgTrVcFxbNsPtQepNKzzt/+QNTYdUVs2Tfe1kedF8DqF32U4Xge42Y7PC337S90jK5ZbQDtNvZ8Z4xUl4/OR0cx2MNJVKUNWa+nld5aqtL3mYO8DWpDIVqkLbkg+QJ+4Qo8pbiLMz53KilXI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; c=relaxed/simple; bh=L/WNQp+cqTFMFR8GqruTG1ecQLPCHMDlMjBtlwWYPR8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YQkFGs7YsJPP7XTlUx+2tNMKvgVfcPm53Zynjs8RXzKKrX9eLAqIWhlGgFlAjtYPRp+ftln2t+iHHOmZld+9BUbLzlxUfBdx/4MPySrUu5RtigCC0FfrTdKLK9RkRCOayCYsSHRK3T5Pa+ENjKHXz+ox+xZimH2WKOMclMb0zew= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=lHbgBImI; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="lHbgBImI" Received: by smtp.kernel.org (Postfix) with ESMTPS id BECC3C19422; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760689989; bh=L/WNQp+cqTFMFR8GqruTG1ecQLPCHMDlMjBtlwWYPR8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=lHbgBImINIa6ujW4J9eVQp10rGAn0P2wdkTCdu6Z+aQki0lQda+R5Id2GU2ic6JJ8 f7eKj+ieOHKw0AHozFSEUcQ6hBI3GtKYCBvVI8kzG5P4S+8Br5q72ZqZ5DYGNPxAKt sgpbPQL5WG7IVlz8IVlG7mYtRnrZpI8YZ2QvHamsvI17rpcM9oR+5uwxb7z2398Raq e4Yo9VdxqvrmvB/WkMYNSH93/SH9l3M14oS7S0xhv0e+fzJLqcJcov1P8jOqkvE+mm KONXKqKNY9BVGITq28eGxHZlheBeTYtQM9CRwN438an6g5VNIqNGNEmeDL+sO8dP/c Q0zfZVJ01ZTlA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id B56B0CCD1A4; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) From: Joel Granados Date: Fri, 17 Oct 2025 10:32:14 +0200 Subject: [PATCH 4/7] sysctl: Move jiffies converters to kernel/time/jiffies.c Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251017-jag-sysctl_jiffies-v1-4-175d81dfdf82@kernel.org> References: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> In-Reply-To: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=12841; i=joel.granados@kernel.org; h=from:subject:message-id; bh=L/WNQp+cqTFMFR8GqruTG1ecQLPCHMDlMjBtlwWYPR8=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGjx/0HQm7+FMboOkcASneud8CDpgPxTFRmlR uZ39AQwIhL9AIkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJo8f9BAAoJELqXzVK3 lkFPK1sL/ihVRYc2Lhpd9Esx/7If8Ls1bU3rBkzwyIgHEiV70zks07H2uUhZHPonzgQVHUJaDQk uep7MywzcbCpyBWBW3vDZoAEfXGuRsQ72sEhFTKNMpkH7uzqzX2Q2gatpHE1JrSdunHVlldIzeC GyeOcu7MLTT4MDc41ubmrpx776DP+h8/H+cSG7sd7x9FLLy3TY19eOqAILoRPmV3pRo/0vULMKU fE+COsGx8OvwQn09skvoWV5HbMLJJqI/ODgdVyYKQv0D1vxIOz26lOHPoP5SkjtU/6jIgqQS/+x W5nonBesm923YenfD310En4vEKdZNyBzEO3w5oznFV5CUmCn/c0UO8pT6b04MBhrvWBxB9N5ylr 2a4/Mid1fBKXc29wiUS85/ze5Zdi+Tv5/S8JUfyrvM0IIGXEygFeyXYn+bM57X5A2Kwy3BTl3Y4 Dv3sHGVbWy/YUR6JsKA38wpJZtaVUd+vWT/oOX0Bbb19AZi9d4kUrr/S1FQCI82zO2cI9dlvXq7 Lg= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Move integer jiffies converters (proc_dointvec{_,_ms_,_userhz_}jiffies and proc_dointvec_ms_jiffies_minmax) to kernel/time/jiffies.c. Error stubs for when CONFIG_PRCO_SYSCTL is not defined are not reproduced because all the jiffies converters go through proc_dointvec_conv which is already stubbed. This is part of the greater effort to move sysctl logic out of kernel/sysctl.c thereby reducing merge conflicts in kernel/sysctl.c. Signed-off-by: Joel Granados --- include/linux/jiffies.h | 9 ++++ include/linux/sysctl.h | 7 --- kernel/sysctl.c | 124 --------------------------------------------= ---- kernel/time/jiffies.c | 100 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 131 deletions(-) diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index 91b20788273dfa224d68fbc84388c297b335af47..09886dcbf718873adf3c24d7eb5= 65f1849fcac04 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h @@ -611,4 +611,13 @@ extern unsigned long nsecs_to_jiffies(u64 n); =20 #define TIMESTAMP_SIZE 30 =20 +int proc_dointvec_jiffies(const struct ctl_table *table, int dir, void *bu= ffer, + size_t *lenp, loff_t *ppos); +int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int dir, + void *buffer, size_t *lenp, loff_t *ppos); +int proc_dointvec_userhz_jiffies(const struct ctl_table *table, int dir, + void *buffer, size_t *lenp, loff_t *ppos); +int proc_dointvec_ms_jiffies(const struct ctl_table *table, int dir, void = *buffer, + size_t *lenp, loff_t *ppos); + #endif diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index faeeb2feefb83d5b57e67f5cbf2eadf79dd03fb2..4894244ade479a84d736e239e33= e0a8d3a0f803d 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -192,13 +192,6 @@ int proc_douintvec_minmax(const struct ctl_table *tabl= e, int write, void *buffer size_t *lenp, loff_t *ppos); int proc_dou8vec_minmax(const struct ctl_table *table, int write, void *bu= ffer, size_t *lenp, loff_t *ppos); -int proc_dointvec_jiffies(const struct ctl_table *, int, void *, size_t *,= loff_t *); -int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int wri= te, - void *buffer, size_t *lenp, loff_t *ppos); -int proc_dointvec_userhz_jiffies(const struct ctl_table *, int, void *, si= ze_t *, - loff_t *); -int proc_dointvec_ms_jiffies(const struct ctl_table *, int, void *, size_t= *, - loff_t *); int proc_doulongvec_minmax(const struct ctl_table *, int, void *, size_t *= , loff_t *); int proc_doulongvec_ms_jiffies_minmax(const struct ctl_table *table, int, = void *, size_t *, loff_t *); diff --git a/kernel/sysctl.c b/kernel/sysctl.c index f3d2385f88494da1e5ba7ee1fbb575d2545d7d84..e00dd55487025fa159eac2f6561= 04c0c843b0519 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -356,36 +356,14 @@ static void proc_put_char(void **buf, size_t *size, c= har c) } =20 #define SYSCTL_CONV_IDENTITY(val) val -#define SYSCTL_CONV_MULT_HZ(val) ((val) * HZ) -#define SYSCTL_CONV_DIV_HZ(val) ((val) / HZ) =20 static SYSCTL_USER_TO_KERN_INT_CONV(, SYSCTL_CONV_IDENTITY) static SYSCTL_KERN_TO_USER_INT_CONV(, SYSCTL_CONV_IDENTITY) =20 -static SYSCTL_USER_TO_KERN_INT_CONV(_hz, SYSCTL_CONV_MULT_HZ) -static SYSCTL_KERN_TO_USER_INT_CONV(_hz, SYSCTL_CONV_DIV_HZ) - -static SYSCTL_USER_TO_KERN_INT_CONV(_userhz, clock_t_to_jiffies) -static SYSCTL_KERN_TO_USER_INT_CONV(_userhz, jiffies_to_clock_t) - -static SYSCTL_USER_TO_KERN_INT_CONV(_ms, msecs_to_jiffies) -static SYSCTL_KERN_TO_USER_INT_CONV(_ms, jiffies_to_msecs) - static SYSCTL_INT_CONV_CUSTOM(, sysctl_user_to_kern_int_conv, sysctl_kern_to_user_int_conv, false) -static SYSCTL_INT_CONV_CUSTOM(_jiffies, sysctl_user_to_kern_int_conv_hz, - sysctl_kern_to_user_int_conv_hz, false) -static SYSCTL_INT_CONV_CUSTOM(_userhz_jiffies, - sysctl_user_to_kern_int_conv_userhz, - sysctl_kern_to_user_int_conv_userhz, false) -static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies, sysctl_user_to_kern_int_conv_ms, - sysctl_kern_to_user_int_conv_ms, false) - static SYSCTL_INT_CONV_CUSTOM(_minmax, sysctl_user_to_kern_int_conv, sysctl_kern_to_user_int_conv, true) -static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies_minmax, - sysctl_user_to_kern_int_conv_ms, - sysctl_kern_to_user_int_conv_ms, true) =20 static SYSCTL_USER_TO_KERN_UINT_CONV(,SYSCTL_CONV_IDENTITY) =20 @@ -900,81 +878,6 @@ int proc_dointvec_conv(const struct ctl_table *table, = int dir, void *buffer, return do_proc_dointvec(table, dir, buffer, lenp, ppos, conv); } =20 -/** - * proc_dointvec_jiffies - read a vector of integers as seconds - * @table: the sysctl table - * @dir: %TRUE if this is a write to the sysctl file - * @buffer: the user buffer - * @lenp: the size of the user buffer - * @ppos: file position - * - * Reads/writes up to table->maxlen/sizeof(unsigned int) integer - * values from/to the user buffer, treated as an ASCII string. - * The values read are assumed to be in seconds, and are converted into - * jiffies. - * - * Returns 0 on success. - */ -int proc_dointvec_jiffies(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos) -{ - return proc_dointvec_conv(table, dir, buffer, lenp, ppos, - do_proc_int_conv_jiffies); -} - -int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos) -{ - return proc_dointvec_conv(table, dir, buffer, lenp, ppos, - do_proc_int_conv_ms_jiffies_minmax); -} - -/** - * proc_dointvec_userhz_jiffies - read a vector of integers as 1/USER_HZ s= econds - * @table: the sysctl table - * @dir: %TRUE if this is a write to the sysctl file - * @buffer: the user buffer - * @lenp: the size of the user buffer - * @ppos: pointer to the file position - * - * Reads/writes up to table->maxlen/sizeof(unsigned int) integer - * values from/to the user buffer, treated as an ASCII string. - * The values read are assumed to be in 1/USER_HZ seconds, and - * are converted into jiffies. - * - * Returns 0 on success. - */ -int proc_dointvec_userhz_jiffies(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos) -{ - if (USER_HZ < HZ) - return -EINVAL; - return proc_dointvec_conv(table, dir, buffer, lenp, ppos, - do_proc_int_conv_userhz_jiffies); -} - -/** - * proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds - * @table: the sysctl table - * @dir: %TRUE if this is a write to the sysctl file - * @buffer: the user buffer - * @lenp: the size of the user buffer - * @ppos: the current position in the file - * - * Reads/writes up to table->maxlen/sizeof(unsigned int) integer - * values from/to the user buffer, treated as an ASCII string. - * The values read are assumed to be in 1/1000 seconds, and - * are converted into jiffies. - * - * Returns 0 on success. - */ -int proc_dointvec_ms_jiffies(const struct ctl_table *table, int dir, void = *buffer, - size_t *lenp, loff_t *ppos) -{ - return proc_dointvec_conv(table, dir, buffer, lenp, ppos, - do_proc_int_conv_ms_jiffies); -} - /** * proc_do_large_bitmap - read/write from/to a large bitmap * @table: the sysctl table @@ -1166,30 +1069,6 @@ int proc_dou8vec_minmax(const struct ctl_table *tabl= e, int dir, return -ENOSYS; } =20 -int proc_dointvec_jiffies(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos) -{ - return -ENOSYS; -} - -int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos) -{ - return -ENOSYS; -} - -int proc_dointvec_userhz_jiffies(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos) -{ - return -ENOSYS; -} - -int proc_dointvec_ms_jiffies(const struct ctl_table *table, int dir, - void *buffer, size_t *lenp, loff_t *ppos) -{ - return -ENOSYS; -} - int proc_doulongvec_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { @@ -1309,11 +1188,8 @@ int __init sysctl_init_bases(void) EXPORT_SYMBOL(proc_dobool); EXPORT_SYMBOL(proc_dointvec); EXPORT_SYMBOL(proc_douintvec); -EXPORT_SYMBOL(proc_dointvec_jiffies); EXPORT_SYMBOL(proc_dointvec_minmax); EXPORT_SYMBOL_GPL(proc_douintvec_minmax); -EXPORT_SYMBOL(proc_dointvec_userhz_jiffies); -EXPORT_SYMBOL(proc_dointvec_ms_jiffies); EXPORT_SYMBOL(proc_dostring); EXPORT_SYMBOL(proc_doulongvec_minmax); EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index 34eeacac225391667e168ec4e1d7261175388d51..2289c11c8bfc218304a620a3541= 109e281b4e581 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c @@ -99,3 +99,103 @@ void __init register_refined_jiffies(long cycles_per_se= cond) =20 __clocksource_register(&refined_jiffies); } + +#define SYSCTL_CONV_MULT_HZ(val) ((val) * HZ) +#define SYSCTL_CONV_DIV_HZ(val) ((val) / HZ) + +static SYSCTL_USER_TO_KERN_INT_CONV(_hz, SYSCTL_CONV_MULT_HZ) +static SYSCTL_KERN_TO_USER_INT_CONV(_hz, SYSCTL_CONV_DIV_HZ) +static SYSCTL_USER_TO_KERN_INT_CONV(_userhz, clock_t_to_jiffies) +static SYSCTL_KERN_TO_USER_INT_CONV(_userhz, jiffies_to_clock_t) +static SYSCTL_USER_TO_KERN_INT_CONV(_ms, msecs_to_jiffies) +static SYSCTL_KERN_TO_USER_INT_CONV(_ms, jiffies_to_msecs) + +static SYSCTL_INT_CONV_CUSTOM(_jiffies, sysctl_user_to_kern_int_conv_hz, + sysctl_kern_to_user_int_conv_hz, false) +static SYSCTL_INT_CONV_CUSTOM(_userhz_jiffies, + sysctl_user_to_kern_int_conv_userhz, + sysctl_kern_to_user_int_conv_userhz, false) +static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies, sysctl_user_to_kern_int_conv_ms, + sysctl_kern_to_user_int_conv_ms, false) +static SYSCTL_INT_CONV_CUSTOM(_ms_jiffies_minmax, + sysctl_user_to_kern_int_conv_ms, + sysctl_kern_to_user_int_conv_ms, true) + +/** + * proc_dointvec_jiffies - read a vector of integers as seconds + * @table: the sysctl table + * @dir: %TRUE if this is a write to the sysctl file + * @buffer: the user buffer + * @lenp: the size of the user buffer + * @ppos: file position + * + * Reads/writes up to table->maxlen/sizeof(unsigned int) integer + * values from/to the user buffer, treated as an ASCII string. + * The values read are assumed to be in seconds, and are converted into + * jiffies. + * + * Returns 0 on success. + */ +int proc_dointvec_jiffies(const struct ctl_table *table, int dir, + void *buffer, size_t *lenp, loff_t *ppos) +{ + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, + do_proc_int_conv_jiffies); +} +EXPORT_SYMBOL(proc_dointvec_jiffies); + +/** + * proc_dointvec_userhz_jiffies - read a vector of integers as 1/USER_HZ s= econds + * @table: the sysctl table + * @dir: %TRUE if this is a write to the sysctl file + * @buffer: the user buffer + * @lenp: the size of the user buffer + * @ppos: pointer to the file position + * + * Reads/writes up to table->maxlen/sizeof(unsigned int) integer + * values from/to the user buffer, treated as an ASCII string. + * The values read are assumed to be in 1/USER_HZ seconds, and + * are converted into jiffies. + * + * Returns 0 on success. + */ +int proc_dointvec_userhz_jiffies(const struct ctl_table *table, int dir, + void *buffer, size_t *lenp, loff_t *ppos) +{ + if (USER_HZ < HZ) + return -EINVAL; + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, + do_proc_int_conv_userhz_jiffies); +} +EXPORT_SYMBOL(proc_dointvec_userhz_jiffies); + +/** + * proc_dointvec_ms_jiffies - read a vector of integers as 1 milliseconds + * @table: the sysctl table + * @dir: %TRUE if this is a write to the sysctl file + * @buffer: the user buffer + * @lenp: the size of the user buffer + * @ppos: the current position in the file + * + * Reads/writes up to table->maxlen/sizeof(unsigned int) integer + * values from/to the user buffer, treated as an ASCII string. + * The values read are assumed to be in 1/1000 seconds, and + * are converted into jiffies. + * + * Returns 0 on success. + */ +int proc_dointvec_ms_jiffies(const struct ctl_table *table, int dir, void = *buffer, + size_t *lenp, loff_t *ppos) +{ + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, + do_proc_int_conv_ms_jiffies); +} + +int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int dir, + void *buffer, size_t *lenp, loff_t *ppos) +{ + return proc_dointvec_conv(table, dir, buffer, lenp, ppos, + do_proc_int_conv_ms_jiffies_minmax); +} +EXPORT_SYMBOL(proc_dointvec_ms_jiffies); + --=20 2.50.1 From nobody Sun Feb 8 08:48:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A0AD929D26D; Fri, 17 Oct 2025 08:33:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; cv=none; b=gt5Y4shZTC3k83i2uevBIpgGjF8qr9x1R84hFCEyixGzPiMRq4Br1jO+BDuPezKdBi4kAaqSIU11yjR8cZnpPfuKmA9yrPy5Twk/FqoKVI0s9B2YOda8VUXdFkTc4CT52ugyHBPibw8w4pQffS66dn0DY6ZznklVjaV3gaFlOTQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; c=relaxed/simple; bh=J/XuDhivZwKAD66MOrIiPHOdTNhERWxIdJGMnXHbn48=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=topTeHqI/1erqYxuJfU/V+M7eQAVekKZMSNtEBTL8ODqOTNYr7hwd1cIElZzlYvOxx/+QJ/aO890ZZG81ZSGe5mzd+wY0kj0syWCYqqBcxP8lqW8fzqCRaXKxhNQO0uVO46vjUFTXcREVt2cWcNTFSmlFkbaD+e0wY+HP/inMuk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=O6P5mPde; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="O6P5mPde" Received: by smtp.kernel.org (Postfix) with ESMTPS id CFE04C19421; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760689989; bh=J/XuDhivZwKAD66MOrIiPHOdTNhERWxIdJGMnXHbn48=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=O6P5mPde7/+qGRjySN5IYoTWp6YWe9DHLZY1lESjpKxslGHpjsxnyktkbH2Wc7mBz LKV4Nu0JLW1vif5fyfk7z5fj5AJTRCbX//09Tn1Gugkx+vrg0NLVEh33vZux4jZbKZ aELrYgay4b9LEsGuoXw/cGv+l4dncGIKkoWKM2X6JtzuvAqGHNvGQhEKLWSD/15Q4E OcFgMCnDcr94eNAwljOuYLZGWS3VLn0UNjFyRdChn32w+iEdJCxA9AZH+znJTkuC6c aLGppTfmaf186wfdAQIU1Xa8REwEJlcRpNWs/Bh3sPNvqTGXge1LKRv+yKVqqP0BU7 sAxTs1T+dXytw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4389CCD19A; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) From: Joel Granados Date: Fri, 17 Oct 2025 10:32:15 +0200 Subject: [PATCH 5/7] sysctl: Move proc_doulongvec_ms_jiffies_minmax to kernel/time/jiffies.c Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251017-jag-sysctl_jiffies-v1-5-175d81dfdf82@kernel.org> References: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> In-Reply-To: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=7144; i=joel.granados@kernel.org; h=from:subject:message-id; bh=J/XuDhivZwKAD66MOrIiPHOdTNhERWxIdJGMnXHbn48=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGjx/0E8TjsdffajbstD7fzBD1y+LUuoPfEtq IJLT5UuMF5y6YkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJo8f9BAAoJELqXzVK3 lkFPOkcL/0pKG04lC051IyOouW0S2NCBIYo8qz+EJ3zFCqKcd5q7by9D3sq9lRr/V6zBm+vWA18 HV/tlLwdqRygCuDxMfFTILDlc8bJIlyp7T9mFpxQ6qzM8U4qiZs8t0tfbVN1v79VWiyxa0j7c4L 9IKiTsj7OQswwytJOiJxu/RubCVOrs6ThM/xKK3aIBG/1QxXYhq2Xq4G518rHKv7wygksRiuJoV /zhrA5jyMJJuhxqhXb6QtEbTd4Y6qJXXAvsGJGghYfbyvX3SJxzKXl4ENylRoF5rxSl+N+sq/m6 nJOEK4Z1umMsrOZF//lm+Z5AsEYg1oTGw7MDe/oGgBdUuU9o8xlNWHieKLuGf5/7Ca0ehiCzXDA 1Anr4gCbOkgoEppToEIqbAhyiZZjnf9K23tECt4rPoMvwrEJCCjS37zvc19PSMh3ppSpcmQIGJc X/7Vny9foeqHuwn04Lyj0dkV3wcZFgEaBdcwcz0zp8ZHbHWqHxOWf92LKhKrh4roo4XxEfbeJe7 Lo= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Move proc_doulongvec_ms_jiffies_minmax to kernel/time/jiffies.c. Create a non static wrapper function proc_doulongvec_minmax_conv that forwards the custom convmul and convdiv argument values to the internal do_proc_doulongvec_minmax. Remove unused linux/times.h include from kernel/sysctl.c. Signed-off-by: Joel Granados --- include/linux/jiffies.h | 2 ++ include/linux/sysctl.h | 5 +++-- kernel/sysctl.c | 41 ++++++++++++----------------------------- kernel/time/jiffies.c | 27 ++++++++++++++++++++++++++- 4 files changed, 43 insertions(+), 32 deletions(-) diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h index 09886dcbf718873adf3c24d7eb565f1849fcac04..2687263c31d9b0d575996228d9a= a63071bea60b5 100644 --- a/include/linux/jiffies.h +++ b/include/linux/jiffies.h @@ -619,5 +619,7 @@ int proc_dointvec_userhz_jiffies(const struct ctl_table= *table, int dir, void *buffer, size_t *lenp, loff_t *ppos); int proc_dointvec_ms_jiffies(const struct ctl_table *table, int dir, void = *buffer, size_t *lenp, loff_t *ppos); +int proc_doulongvec_ms_jiffies_minmax(const struct ctl_table *table, int d= ir, + void *buffer, size_t *lenp, loff_t *ppos); =20 #endif diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 4894244ade479a84d736e239e33e0a8d3a0f803d..9396bb421cd5e1e9076de0c77c4= 5a870c453aee1 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -193,8 +193,9 @@ int proc_douintvec_minmax(const struct ctl_table *table= , int write, void *buffer int proc_dou8vec_minmax(const struct ctl_table *table, int write, void *bu= ffer, size_t *lenp, loff_t *ppos); int proc_doulongvec_minmax(const struct ctl_table *, int, void *, size_t *= , loff_t *); -int proc_doulongvec_ms_jiffies_minmax(const struct ctl_table *table, int, = void *, - size_t *, loff_t *); +int proc_doulongvec_minmax_conv(const struct ctl_table *table, int dir, + void *buffer, size_t *lenp, loff_t *ppos, + unsigned long convmul, unsigned long convdiv); int proc_do_large_bitmap(const struct ctl_table *, int, void *, size_t *, = loff_t *); int proc_do_static_key(const struct ctl_table *table, int write, void *buf= fer, size_t *lenp, loff_t *ppos); diff --git a/kernel/sysctl.c b/kernel/sysctl.c index e00dd55487025fa159eac2f656104c0c843b0519..6750ddbc15b2bb9ee9de0d48ac9= 99a4c3a2ec5d6 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include @@ -824,6 +823,14 @@ static int do_proc_doulongvec_minmax(const struct ctl_= table *table, int dir, return err; } =20 +int proc_doulongvec_minmax_conv(const struct ctl_table *table, int dir, + void *buffer, size_t *lenp, loff_t *ppos, + unsigned long convmul, unsigned long convdiv) +{ + return do_proc_doulongvec_minmax(table, dir, buffer, lenp, ppos, + convmul, convdiv); +} + /** * proc_doulongvec_minmax - read a vector of long integers with min/max va= lues * @table: the sysctl table @@ -843,31 +850,7 @@ static int do_proc_doulongvec_minmax(const struct ctl_= table *table, int dir, int proc_doulongvec_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_doulongvec_minmax(table, dir, buffer, lenp, ppos, 1l, 1l); -} - -/** - * proc_doulongvec_ms_jiffies_minmax - read a vector of millisecond values= with min/max values - * @table: the sysctl table - * @dir: %TRUE if this is a write to the sysctl file - * @buffer: the user buffer - * @lenp: the size of the user buffer - * @ppos: file position - * - * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long - * values from/to the user buffer, treated as an ASCII string. The values - * are treated as milliseconds, and converted to jiffies when they are sto= red. - * - * This routine will ensure the values are within the range specified by - * table->extra1 (min) and table->extra2 (max). - * - * Returns 0 on success. - */ -int proc_doulongvec_ms_jiffies_minmax(const struct ctl_table *table, int d= ir, - void *buffer, size_t *lenp, loff_t *ppos) -{ - return do_proc_doulongvec_minmax(table, dir, buffer, - lenp, ppos, HZ, 1000l); + return proc_doulongvec_minmax_conv(table, dir, buffer, lenp, ppos, 1l, 1l= ); } =20 int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffe= r, @@ -1075,8 +1058,9 @@ int proc_doulongvec_minmax(const struct ctl_table *ta= ble, int dir, return -ENOSYS; } =20 -int proc_doulongvec_ms_jiffies_minmax(const struct ctl_table *table, int d= ir, - void *buffer, size_t *lenp, loff_t *ppos) +int proc_doulongvec_minmax_conv(const struct ctl_table *table, int dir, + void *buffer, size_t *lenp, loff_t *ppos, + unsigned long convmul, unsigned long convdiv) { return -ENOSYS; } @@ -1192,5 +1176,4 @@ EXPORT_SYMBOL(proc_dointvec_minmax); EXPORT_SYMBOL_GPL(proc_douintvec_minmax); EXPORT_SYMBOL(proc_dostring); EXPORT_SYMBOL(proc_doulongvec_minmax); -EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); EXPORT_SYMBOL(proc_do_large_bitmap); diff --git a/kernel/time/jiffies.c b/kernel/time/jiffies.c index 2289c11c8bfc218304a620a3541109e281b4e581..5fa02fa8d3f45051d8fbbade783= e999e9b29a399 100644 --- a/kernel/time/jiffies.c +++ b/kernel/time/jiffies.c @@ -190,6 +190,7 @@ int proc_dointvec_ms_jiffies(const struct ctl_table *ta= ble, int dir, void *buffe return proc_dointvec_conv(table, dir, buffer, lenp, ppos, do_proc_int_conv_ms_jiffies); } +EXPORT_SYMBOL(proc_dointvec_ms_jiffies); =20 int proc_dointvec_ms_jiffies_minmax(const struct ctl_table *table, int dir, void *buffer, size_t *lenp, loff_t *ppos) @@ -197,5 +198,29 @@ int proc_dointvec_ms_jiffies_minmax(const struct ctl_t= able *table, int dir, return proc_dointvec_conv(table, dir, buffer, lenp, ppos, do_proc_int_conv_ms_jiffies_minmax); } -EXPORT_SYMBOL(proc_dointvec_ms_jiffies); + +/** + * proc_doulongvec_ms_jiffies_minmax - read a vector of millisecond values= with min/max values + * @table: the sysctl table + * @dir: %TRUE if this is a write to the sysctl file + * @buffer: the user buffer + * @lenp: the size of the user buffer + * @ppos: file position + * + * Reads/writes up to table->maxlen/sizeof(unsigned long) unsigned long + * values from/to the user buffer, treated as an ASCII string. The values + * are treated as milliseconds, and converted to jiffies when they are sto= red. + * + * This routine will ensure the values are within the range specified by + * table->extra1 (min) and table->extra2 (max). + * + * Returns 0 on success. + */ +int proc_doulongvec_ms_jiffies_minmax(const struct ctl_table *table, int d= ir, + void *buffer, size_t *lenp, loff_t *ppos) +{ + return proc_doulongvec_minmax_conv(table, dir, buffer, lenp, ppos, + HZ, 1000l); +} +EXPORT_SYMBOL(proc_doulongvec_ms_jiffies_minmax); =20 --=20 2.50.1 From nobody Sun Feb 8 08:48:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3A8729E0E5; Fri, 17 Oct 2025 08:33:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; cv=none; b=MzlNVmKhq9uFmqO8qXgRwBeJMkNmkXOYfjqy+CEqJt1XlLVxvSq9dZ0gLelFUvt5oQyDlTq4RD0wYchPnbJ/bQsuVsT/rshC8H0ccxWVLSfsIggpu1LSuL9vs4d2JOKRBke0b576r3ysh0NJCrLc5GoegXnf/vfcXo0SSoawfCE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; c=relaxed/simple; bh=iaAU8r3Z3qFlnpkaBE2GnAyYsz/OD81BAxEiYGaHlFY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MTz/MoZEePHnx3dLrGRaU0ZANSLP1ATPaN3pl2KX2zCh6FYRi5wXvtA60qzOTY/is7ItoKbojRNckdL/QBrhuHRveDb/97FiEbSFOD9uphPrBOnLF5q81Ip/+CyfhccMk5TvjI+56Y+oM8zp5aq8qlDSKMxKtJMDVL8oYQ27qdk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=PytkK8bF; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="PytkK8bF" Received: by smtp.kernel.org (Postfix) with ESMTPS id DA7D3C113D0; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760689989; bh=iaAU8r3Z3qFlnpkaBE2GnAyYsz/OD81BAxEiYGaHlFY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=PytkK8bFd6c+2CvKp7AddXr4zdztxBHRiX3+lXSEH4nBT4W4Cc5oDZkYlpnLfYaMn m2CC8OxMvD4iYoxtK55h5l6KuMxThR2tL1jFnOMcPvyh5hxIbRV734RwoG97ekWKmi qUBaI8hu+uxg43oVs3lwNaDTanV+vwFH48A11VyiFkj8sv7XidSWxGyMIFImhhQDKE Dq0AhOVKUtK3ctow0fNWEsAH6ixYOhIOULoUUM7V6FZqFqsutRGL8MwkvPbl+W15rh 9cZIRSXeDIMajx+y8R+su/OpVmnZ83j4JlIGWqF1+zRrSidr9lMn8JmYJkiKvNnzJk Bb71XEwFzUFeQ== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id D2121CCD195; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) From: Joel Granados Date: Fri, 17 Oct 2025 10:32:16 +0200 Subject: [PATCH 6/7] sysctl: Create pipe-max-size converter using sysctl UINT macros Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251017-jag-sysctl_jiffies-v1-6-175d81dfdf82@kernel.org> References: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> In-Reply-To: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3090; i=joel.granados@kernel.org; h=from:subject:message-id; bh=iaAU8r3Z3qFlnpkaBE2GnAyYsz/OD81BAxEiYGaHlFY=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGjx/0JMXzw+IGByIDEf2hnHT2lY4g4dLxh9u m7nEtU+LVnW0YkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJo8f9CAAoJELqXzVK3 lkFPV+wMAJd5VdIzIhNGt1xU7YgreVISGoU+98Uv0nB8pWNGvR4hMmxuAhd5fyee4PZ5zIoz+Y5 1zg9FEtrkqI+2NUQF2He/sZNz7ch3e8ppmFbh7PcnqiokoVlia0kn4OHXVCI+Mfur0xX3TJAkst 9NRbmVd3JL0QzuzV79KReAHc8pHWSB16l+po3l8TKwblZ+3Rvi8S/EPWqE75xykrPB+GVvcg7hD CMdOq7HWUgaB2tZI+j773cyHkI3RYfgAh+RElRR1Z3UOCvmMK/z95QpFsc3CJp5JdOgrQnZ5awo QNapCYBXTDq/XYK4eCjBvs4fP/zAt0xXzIATGtLpoP5CCp7rBGymdvzXgufzQh8kuZLTJ10w/cW WF/gDQEUBnqd3nqYxPxRupzJ4pLMecRzmPNwS34hugvJ+FjOwzV6j7rp4ys9FWaEagPbwJ5R3bR x14oD5NLKLEoSZqihVgyvGB6SXaVKH31FQjtB2/QMzTpzfR0Yc5fIQlK3EmVxNSuraHzUwA6AG5 J4= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Create a converter for the pipe-max-size proc_handler using the SYSCTL_UINT_CONV_CUSTOM. Move SYSCTL_CONV_IDENTITY macro to the sysctl header to make it available for pipe size validation. Keep returning -EINVAL when (val =3D=3D 0) by using a range checking converter and setting the minimal valid value (extern1) to SYSCTL_ONE. Keep round_pipe_size by passing it as the operation for SYSCTL_USER_TO_KERN_INT_CONV. Signed-off-by: Joel Granados --- fs/pipe.c | 26 ++++++-------------------- include/linux/sysctl.h | 1 + kernel/sysctl.c | 2 -- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 2431f05cb788f5bd89660f0fc6f4c4696e17d5dd..974faf06a3136fff7a382e57551= 4d84fcf86183c 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -1479,31 +1479,16 @@ static struct file_system_type pipe_fs_type =3D { }; =20 #ifdef CONFIG_SYSCTL -static int do_proc_dopipe_max_size_conv(unsigned long *lvalp, - unsigned int *valp, int write, - const struct ctl_table *table) -{ - if (write) { - unsigned int val; - - val =3D round_pipe_size(*lvalp); - if (val =3D=3D 0) - return -EINVAL; - - *valp =3D val; - } else { - unsigned int val =3D *valp; - *lvalp =3D (unsigned long) val; - } - - return 0; -} +static SYSCTL_USER_TO_KERN_UINT_CONV(_pipe_maxsz, round_pipe_size) +static SYSCTL_UINT_CONV_CUSTOM(_pipe_maxsz, + sysctl_user_to_kern_uint_conv_pipe_maxsz, + sysctl_kern_to_user_uint_conv, true) =20 static int proc_dopipe_max_size(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos) { return do_proc_douintvec(table, write, buffer, lenp, ppos, - do_proc_dopipe_max_size_conv); + do_proc_uint_conv_pipe_maxsz); } =20 static const struct ctl_table fs_pipe_sysctls[] =3D { @@ -1513,6 +1498,7 @@ static const struct ctl_table fs_pipe_sysctls[] =3D { .maxlen =3D sizeof(pipe_max_size), .mode =3D 0644, .proc_handler =3D proc_dopipe_max_size, + .extra1 =3D SYSCTL_ONE, }, { .procname =3D "pipe-user-pages-hard", diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index 9396bb421cd5e1e9076de0c77c45a870c453aee1..ee5e2b3f47db834b084ac0fc410= 8bf28177b6949 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -59,6 +59,7 @@ extern const int sysctl_vals[]; #define SYSCTL_LONG_ONE ((void *)&sysctl_long_vals[1]) #define SYSCTL_LONG_MAX ((void *)&sysctl_long_vals[2]) =20 +#define SYSCTL_CONV_IDENTITY(val) (val) /** * * "dir" originates from read_iter (dir =3D 0) or write_iter (dir =3D 1) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 6750ddbc15b2bb9ee9de0d48ac999a4c3a2ec5d6..d2e756ee3717b07fd8488712676= 56ee0ed7d9268 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -354,8 +354,6 @@ static void proc_put_char(void **buf, size_t *size, cha= r c) } } =20 -#define SYSCTL_CONV_IDENTITY(val) val - static SYSCTL_USER_TO_KERN_INT_CONV(, SYSCTL_CONV_IDENTITY) static SYSCTL_KERN_TO_USER_INT_CONV(, SYSCTL_CONV_IDENTITY) =20 --=20 2.50.1 From nobody Sun Feb 8 08:48:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A118A29D279; Fri, 17 Oct 2025 08:33:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; cv=none; b=IbzLXCRZej85dbXzDU681R+Xsf/R0dzPBGIUA+BciLZxVi612+gmBBx3/i673HeAdQ8oaYavaGfsrvYf/2pm318vakdO0N0BAkINkZenOIbBLEiHAI7x9UBDd+22fRH8ZrBmAXy5SXaoGFuPK1IMcSIabCdUNy9ccR6vWlTo0FQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1760689990; c=relaxed/simple; bh=mWqfj7aYT75N2bYxpf3Zo3oTUcwgYuFyt3SBJHq02zU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tgd0g0bpO0Q+L39j8XZII4JbP72RJTpToJ0GBokS8euW3A+0FLTYbKHut39nH2bDPjbECC90XCSWAFGMocX7qgIEPq8usqb11FDbffnf6OEPPSYYbhLPuCH7JbFOuP3X7HEQuppoyJLa2mNx0weR6U3LgIIsEnN1hIDHZ+mqX0c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=A291P+Ha; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="A291P+Ha" Received: by smtp.kernel.org (Postfix) with ESMTPS id E7E8CC19423; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1760689990; bh=mWqfj7aYT75N2bYxpf3Zo3oTUcwgYuFyt3SBJHq02zU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=A291P+HaWmzhovKlH5FzS7qpOOMNXOBfMWGlL48Phw367hy+ALK0oINmkx4Ld/KKr v0itTRnFL5CCcQfIE97hc8JWGqFKX5YGDIkJvFfvScj9nwRyfOhbciNbvx/QjwR0fD xXKoUiKqESVM4xVBxzc1YQEOEfr4aLdvo+fkqjCPg3VJbjIjZKmGjiHP1nPbphKxI+ Uv/jdj0AfhaR71suXwGBZpVe9utxtbMZAjCbP1sJ1CQJkf8AGolrntBqBjnhEyOU4H 46EPyNpAqdSkboTj5uF1RysPl5Y2EaFN844NqY/QPU1wi9o3yPSL97s5fPSA+7E5y5 72GVlg64tzRbg== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id DF6F1CCD1A2; Fri, 17 Oct 2025 08:33:09 +0000 (UTC) From: Joel Granados Date: Fri, 17 Oct 2025 10:32:17 +0200 Subject: [PATCH 7/7] sysctl: Wrap do_proc_douintvec with the public function proc_douintvec_conv Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251017-jag-sysctl_jiffies-v1-7-175d81dfdf82@kernel.org> References: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> In-Reply-To: <20251017-jag-sysctl_jiffies-v1-0-175d81dfdf82@kernel.org> To: Kees Cook , Alexander Viro , Christian Brauner , Jan Kara Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Joel Granados X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=4508; i=joel.granados@kernel.org; h=from:subject:message-id; bh=mWqfj7aYT75N2bYxpf3Zo3oTUcwgYuFyt3SBJHq02zU=; b=owJ4nAHtARL+kA0DAAoBupfNUreWQU8ByyZiAGjx/0NSnPuToqzCq4T5K/jyOYgldzU5gArb+ vrMeqWF6yqYZYkBswQAAQoAHRYhBK5HCVcl5jElzssnkLqXzVK3lkFPBQJo8f9DAAoJELqXzVK3 lkFPDCML/jLcbIA2ClNcrGBP7q/cygtYLu+PcglKO4jiAc1Ay3kVzqDBAHJ5gFZYBPgt2WI5oxa tEkZ8rJAS7RgDHZ0jeTmZ9S33WGhNpq5SJmXWxKA9y5jzDGMic/CcynRnWVoV9nTTjlB2zuC2kX U54r0bz2Ke13wavvnofxB2WOEZSFMQ8fwhztwbqY2PrYstl/2/qTOefj/8SIMI38FuUVGsn0IV6 G7DUmQ55oB/A0Lj7T28aSp7QvZ7WKEEcZILTIircuoXN/ABUBv5YpW1KZD5T4Ig/Tp3EcfDLj6q sueCceVRPkHvT57cuJM0gI7AltS//2+0J7zPVGqhyBB/s7stZ0h+Wby4yxTcFzVdKq+FAU2lGTu e0L6ujAkwE6JhdZ94SlSqNigWqNRWB6WrHyGFgfu2d8i4wXC9DRTp1gCLqsP9O9fPrkprPxPgCK bGWMepboVTVxIMw8eEA7R/rmOpZYdcRmzH3CCvr3pPlJVBDfqHOxhLGfLTNNCtWVOHN/KNFaaW6 gM= X-Developer-Key: i=joel.granados@kernel.org; a=openpgp; fpr=F1F8E46D30F0F6C4A45FF4465895FAAC338C6E77 X-Endpoint-Received: by B4 Relay for joel.granados@kernel.org/default with auth_id=239 Make do_proc_douintvec static and export proc_douintvec_conv wrapper function for external use. This is to keep with the design in sysctl.c. Update fs/pipe.c to use the new public API. Signed-off-by: Joel Granados --- fs/pipe.c | 4 ++-- include/linux/sysctl.h | 13 +++++++------ kernel/sysctl.c | 18 ++++++++++++++---- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/fs/pipe.c b/fs/pipe.c index 974faf06a3136fff7a382e575514d84fcf86183c..59b60a9374e671f7e129f5ebfde= 066c1756c00b3 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -1487,8 +1487,8 @@ static SYSCTL_UINT_CONV_CUSTOM(_pipe_maxsz, static int proc_dopipe_max_size(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos) { - return do_proc_douintvec(table, write, buffer, lenp, ppos, - do_proc_uint_conv_pipe_maxsz); + return proc_douintvec_conv(table, write, buffer, lenp, ppos, + do_proc_uint_conv_pipe_maxsz); } =20 static const struct ctl_table fs_pipe_sysctls[] =3D { diff --git a/include/linux/sysctl.h b/include/linux/sysctl.h index ee5e2b3f47db834b084ac0fc4108bf28177b6949..727dfc7771de1b7a562e9b930f6= 851873574b532 100644 --- a/include/linux/sysctl.h +++ b/include/linux/sysctl.h @@ -183,14 +183,20 @@ int proc_dostring(const struct ctl_table *, int, void= *, size_t *, loff_t *); int proc_dobool(const struct ctl_table *table, int write, void *buffer, size_t *lenp, loff_t *ppos); int proc_dointvec(const struct ctl_table *, int, void *, size_t *, loff_t = *); +int proc_dointvec_minmax(const struct ctl_table *table, int dir, void *buf= fer, + size_t *lenp, loff_t *ppos); int proc_dointvec_conv(const struct ctl_table *table, int dir, void *buffe= r, size_t *lenp, loff_t *ppos, int (*conv)(bool *negp, unsigned long *u_ptr, int *k_ptr, int dir, const struct ctl_table *table)); int proc_douintvec(const struct ctl_table *, int, void *, size_t *, loff_t= *); -int proc_dointvec_minmax(const struct ctl_table *, int, void *, size_t *, = loff_t *); int proc_douintvec_minmax(const struct ctl_table *table, int write, void *= buffer, size_t *lenp, loff_t *ppos); +int proc_douintvec_conv(const struct ctl_table *table, int write, void *bu= ffer, + size_t *lenp, loff_t *ppos, + int (*conv)(unsigned long *lvalp, unsigned int *valp, + int write, const struct ctl_table *table)); + int proc_dou8vec_minmax(const struct ctl_table *table, int write, void *bu= ffer, size_t *lenp, loff_t *ppos); int proc_doulongvec_minmax(const struct ctl_table *, int, void *, size_t *= , loff_t *); @@ -349,11 +355,6 @@ extern struct ctl_table_header *register_sysctl_mount_= point(const char *path); =20 void do_sysctl_args(void); bool sysctl_is_alias(char *param); -int do_proc_douintvec(const struct ctl_table *table, int write, - void *buffer, size_t *lenp, loff_t *ppos, - int (*conv)(unsigned long *lvalp, - unsigned int *valp, int write, - const struct ctl_table *table)); =20 extern int unaligned_enabled; extern int no_unaligned_warning; diff --git a/kernel/sysctl.c b/kernel/sysctl.c index d2e756ee3717b07fd848871267656ee0ed7d9268..b7c0c78417020d9c7525d4e542b= e79e8e61bb88a 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -534,10 +534,11 @@ static int do_proc_douintvec_r(const struct ctl_table= *table, void *buffer, return err; } =20 -int do_proc_douintvec(const struct ctl_table *table, int dir, void *buffer, - size_t *lenp, loff_t *ppos, - int (*conv)(unsigned long *u_ptr, unsigned int *k_ptr, - int dir, const struct ctl_table *table)) +static int do_proc_douintvec(const struct ctl_table *table, int dir, + void *buffer, size_t *lenp, loff_t *ppos, + int (*conv)(unsigned long *u_ptr, + unsigned int *k_ptr, int dir, + const struct ctl_table *table)) { unsigned int vleft; =20 @@ -566,6 +567,15 @@ int do_proc_douintvec(const struct ctl_table *table, i= nt dir, void *buffer, return do_proc_douintvec_r(table, buffer, lenp, ppos, conv); } =20 +int proc_douintvec_conv(const struct ctl_table *table, int dir, void *buff= er, + size_t *lenp, loff_t *ppos, + int (*conv)(unsigned long *u_ptr, unsigned int *k_ptr, + int dir, const struct ctl_table *table)) +{ + return do_proc_douintvec(table, dir, buffer, lenp, ppos, conv); +} + + /** * proc_dobool - read/write a bool * @table: the sysctl table --=20 2.50.1