From d02f9a0b0b95ac6ada6be0b2b9a1e164f75a425d Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Wed, 28 Apr 2010 01:13:30 +0100 Subject: [PATCH] Linux: Register number sysctls only when desperate The AFS sysctl interface was trying to register numeric system calls whenever the kernel would let it. This is anti-social, as we've never had sysctl numbers allocated to us. In kernels newer than 2.6.24, this misbehaviour is detected and punished. In recent kernels, the binary interface has gone away entirely. Since 2.6.19, the kernel has supported allocated unnumbered system calls. These are only available via /proc/sys (and not the using the legacy, binary, API), but they're really the only interface available to us. Change the sysctl registration code to use unnumbered calls whenever they are available. Unnumbered calls aren't available in 2.4.x, so completely remove that code there. Change-Id: I882117ca2250894f479292026fed84ff0b5e7972 Reviewed-on: http://gerrit.openafs.org/1871 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- acinclude.m4 | 1 - src/afs/LINUX/osi_sysctl.c | 30 +++++++++--------- src/afs/LINUX24/osi_sysctl.c | 60 ------------------------------------ src/cf/linux-test4.m4 | 11 ------- 4 files changed, 15 insertions(+), 87 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index a4eb04a98..7aaef2a67 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -935,7 +935,6 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) LINUX_KEY_ALLOC_NEEDS_CRED LINUX_INIT_WORK_HAS_DATA LINUX_REGISTER_SYSCTL_TABLE_NOFLAG - LINUX_SYSCTL_TABLE_CHECKING LINUX_EXPORTS_INIT_MM LINUX_EXPORTS_SYS_CHDIR LINUX_EXPORTS_SYS_OPEN diff --git a/src/afs/LINUX/osi_sysctl.c b/src/afs/LINUX/osi_sysctl.c index c8b5bfbd3..a8f7face5 100644 --- a/src/afs/LINUX/osi_sysctl.c +++ b/src/afs/LINUX/osi_sysctl.c @@ -37,7 +37,7 @@ static struct ctl_table_header *afs_sysctl = NULL; static ctl_table afs_sysctl_table[] = { { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 1, @@ -51,7 +51,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 2, @@ -65,7 +65,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 3, @@ -79,7 +79,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 4, @@ -93,7 +93,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 5, @@ -107,7 +107,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 6, @@ -121,7 +121,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 7, @@ -135,7 +135,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 8, @@ -149,7 +149,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 9, @@ -163,7 +163,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 10, @@ -177,7 +177,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 11, @@ -191,7 +191,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 12, @@ -205,7 +205,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 13, @@ -219,7 +219,7 @@ static ctl_table afs_sysctl_table[] = { }, { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 14, @@ -237,7 +237,7 @@ static ctl_table afs_sysctl_table[] = { static ctl_table fs_sysctl_table[] = { { #if defined(STRUCT_CTL_TABLE_HAS_CTL_NAME) -#if defined(SYSCTL_TABLE_CHECKING) +#if defined(CTL_UNNUMBERED) .ctl_name = CTL_UNNUMBERED, #else .ctl_name = 1, diff --git a/src/afs/LINUX24/osi_sysctl.c b/src/afs/LINUX24/osi_sysctl.c index 89bd63d03..9933c3a37 100644 --- a/src/afs/LINUX24/osi_sysctl.c +++ b/src/afs/LINUX24/osi_sysctl.c @@ -36,11 +36,7 @@ static struct ctl_table_header *afs_sysctl = NULL; static ctl_table afs_sysctl_table[] = { { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 1, -#endif .procname = "hm_retry_RO", .data = &hm_retry_RO, .maxlen = sizeof(afs_int32), @@ -48,11 +44,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 2, -#endif .procname = "hm_retry_RW", .data = &hm_retry_RW, .maxlen = sizeof(afs_int32), @@ -60,11 +52,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 3, -#endif .procname = "hm_retry_int", .data = &hm_retry_int, .maxlen = sizeof(afs_int32), @@ -72,11 +60,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 4, -#endif .procname = "GCPAGs", .data = &afs_gcpags, .maxlen = sizeof(afs_int32), @@ -84,11 +68,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 5, -#endif .procname = "rx_deadtime", .data = &afs_rx_deadtime, .maxlen = sizeof(afs_int32), @@ -96,11 +76,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 6, -#endif .procname = "bkVolPref", .data = &afs_bkvolpref, .maxlen = sizeof(afs_int32), @@ -108,11 +84,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 7, -#endif .procname = "afs_blocksUsed", .data = &afs_blocksUsed, .maxlen = sizeof(afs_int32), @@ -120,11 +92,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 8, -#endif .procname = "afs_blocksUsed_0", .data = &afs_blocksUsed_0, .maxlen = sizeof(afs_int32), @@ -132,11 +100,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 9, -#endif .procname = "afs_blocksUsed_1", .data = &afs_blocksUsed_1, .maxlen = sizeof(afs_int32), @@ -144,11 +108,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 10, -#endif .procname = "afs_blocksUsed_2", .data = &afs_blocksUsed_2, .maxlen = sizeof(afs_int32), @@ -156,11 +116,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 11, -#endif .procname = "afs_pct1", .data = &afs_pct1, .maxlen = sizeof(afs_int32), @@ -168,11 +124,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 12, -#endif .procname = "afs_pct2", .data = &afs_pct2, .maxlen = sizeof(afs_int32), @@ -180,11 +132,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 13, -#endif .procname = "afs_cacheBlocks", .data = &afs_cacheBlocks, .maxlen = sizeof(afs_int32), @@ -192,11 +140,7 @@ static ctl_table afs_sysctl_table[] = { .proc_handler = &proc_dointvec }, { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 14, -#endif .procname = "md5inum", .data = &afs_new_inum, .maxlen = sizeof(afs_int32), @@ -208,11 +152,7 @@ static ctl_table afs_sysctl_table[] = { static ctl_table fs_sysctl_table[] = { { -#if defined(SYSCTL_TABLE_CHECKING) - .ctl_name = CTL_UNNUMBERED, -#else .ctl_name = 1, -#endif .procname = "afs", .mode = 0555, .child = afs_sysctl_table diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index 8b4fd94c7..bc62aec8d 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -442,17 +442,6 @@ AC_DEFUN([LINUX_KMEM_CACHE_INIT], [ ]) -AC_DEFUN([LINUX_SYSCTL_TABLE_CHECKING], [ - AC_CHECK_LINUX_BUILD([for sysctl table checking], - [ac_cv_linux_sysctl_table_checking], - [#include ], - [extern int sysctl_check_table(int) __attribute__((weak)); - sysctl_check_table(NULL);], - [SYSCTL_TABLE_CHECKING], - [define if your kernel has sysctl table checking]) -]) - - AC_DEFUN([LINUX_EXPORTS_PROC_ROOT_FS], [ AC_CHECK_LINUX_BUILD([if proc_root_fs is defined and exported], [ac_cv_linux_exports_proc_root_fs], -- 2.39.5