Linux: Register number sysctls only when desperate
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Wed, 28 Apr 2010 00:13:30 +0000 (01:13 +0100)
committerDerrick Brashear <shadow@dementia.org>
Wed, 28 Apr 2010 04:43:15 +0000 (21:43 -0700)
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 <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

acinclude.m4
src/afs/LINUX/osi_sysctl.c
src/afs/LINUX24/osi_sysctl.c
src/cf/linux-test4.m4

index a4eb04a..7aaef2a 100644 (file)
@@ -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
index c8b5bfb..a8f7fac 100644 (file)
@@ -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, 
index 89bd63d..9933c3a 100644 (file)
@@ -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
index 8b4fd94..bc62aec 100644 (file)
@@ -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 <linux/sysctl.h>],
-                      [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],