]> granicus.if.org Git - zfs/commitdiff
Linux 2.6.32 compat, proc_handler() API change
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 4 Mar 2010 20:14:56 +0000 (12:14 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 4 Mar 2010 20:14:56 +0000 (12:14 -0800)
As of linux-2.6.32 the 'struct file *filp' argument was dropped from
the proc_handle() prototype.  It was apparently unused _almost_
everywhere in the kernel and this was simply cleanup.

I've added a new SPL_AC_5ARGS_PROC_HANDLER autoconf check for this and
the proper compat macros to correctly define the prototypes and some
helper functions.  It's not pretty but API compat changes rarely are.

config/spl-build.m4
configure
include/linux/sysctl_compat.h [new file with mode: 0644]
include/sys/types.h
module/spl/spl-proc.c
spl_config.h.in

index 9fa7bc8118dd1f16b55ee1ed7ba9eb00b12f882a..e2e2112e73fbb19c6c4f7441c4012c04d2049435 100644 (file)
@@ -72,6 +72,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        SPL_AC_CRED_STRUCT
        SPL_AC_GROUPS_SEARCH
        SPL_AC_PUT_TASK_STRUCT
+       SPL_AC_5ARGS_PROC_HANDLER
 ])
 
 AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
@@ -1371,3 +1372,22 @@ AC_DEFUN([SPL_AC_PUT_TASK_STRUCT], [
                [__put_task_struct() is available])],
                [])
 ])
+
+dnl #
+dnl # 2.6.32 API change,
+dnl # Unused 'struct file *' removed from prototype.
+dnl #
+AC_DEFUN([SPL_AC_5ARGS_PROC_HANDLER], [
+       AC_MSG_CHECKING([whether proc_handler() wants 5 args])
+       SPL_LINUX_TRY_COMPILE([
+               #include <linux/sysctl.h>
+       ],[
+               proc_dostring(NULL, 0, NULL, NULL, NULL);
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_5ARGS_PROC_HANDLER, 1,
+                         [proc_handler() wants 5 args])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
index 192a08442fa8398812498289843592da8ead199f..99c064d4395da80cc5d53749d60368da4988e299 100755 (executable)
--- a/configure
+++ b/configure
@@ -22231,6 +22231,71 @@ _ACEOF
        fi
 
 
+
+       echo "$as_me:$LINENO: checking whether proc_handler() wants 5 args" >&5
+echo $ECHO_N "checking whether proc_handler() wants 5 args... $ECHO_C" >&6
+
+
+cat >conftest.c <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/sysctl.h>
+
+int
+main (void)
+{
+
+               proc_dostring(NULL, 0, NULL, NULL, NULL);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_5ARGS_PROC_HANDLER 1
+_ACEOF
+
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+
+
+fi
+
+       rm -Rf build
+
+
+
  ;;
                 user)      ;;
                 all)
@@ -25513,6 +25578,71 @@ _ACEOF
 
 
 
+       echo "$as_me:$LINENO: checking whether proc_handler() wants 5 args" >&5
+echo $ECHO_N "checking whether proc_handler() wants 5 args... $ECHO_C" >&6
+
+
+cat >conftest.c <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/sysctl.h>
+
+int
+main (void)
+{
+
+               proc_dostring(NULL, 0, NULL, NULL, NULL);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_5ARGS_PROC_HANDLER 1
+_ACEOF
+
+
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
                            ;;
                srpm)                        ;;
                 *)
diff --git a/include/linux/sysctl_compat.h b/include/linux/sysctl_compat.h
new file mode 100644 (file)
index 0000000..ecc5d19
--- /dev/null
@@ -0,0 +1,72 @@
+#ifndef _SPL_SYSCTL_COMPAT_H
+#define _SPL_SYSCTL_COMPAT_H
+
+#include <linux/sysctl.h>
+
+/* proc_handler() / proc_do* API changes
+ * 2.6.x  - 2.6.31: 6 args, prototype includes 'struct file *'
+ * 2.6.32 - 2.6.y:  5 args, removed unused 'struct file *' from prototype
+ *
+ * Generic SPL_PROC_HANDLER() macro should be used for correct prototypes.
+ * It will define the following function arguments which can and should be
+ * used with the spl_proc_* helper macros.
+ *
+ *   struct ctl_table *table,
+ *   int write,
+ *   struct file *filp [2.6.31 and earlier kernels],
+ *   void __user *buffer,
+ *   size_t *lenp,
+ *   loff_t *ppos,
+ */
+#ifdef HAVE_5ARGS_PROC_HANDLER
+
+#define SPL_PROC_HANDLER(proc_handler)                                       \
+static int                                                                   \
+proc_handler(struct ctl_table *table, int write,                             \
+             void __user *buffer, size_t *lenp, loff_t *ppos)              
+                                                                           
+#define spl_proc_dostring(table, write, filp, buffer, lenp, ppos)            \
+       proc_dostring(table, write, buffer, lenp, ppos)                    
+#define spl_proc_dointvec(table, write, filp, buffer, lenp, ppos)            \
+       proc_dointvec(table, write, buffer, lenp, ppos)                    
+#define spl_proc_dointvec_minmax(table, write, filp, buffer, lenp, ppos)     \
+       proc_dointvec_minmax(table, write, buffer, lenp, ppos)                    
+#define spl_proc_dointvec_jiffies(table, write, filp, buffer, lenp, ppos)    \
+       proc_dointvec_jiffies(table, write, buffer, lenp, ppos)                    
+#define spl_proc_dointvec_userhz_jiffies(table,write,filp,buffer,lenp,ppos)  \
+       proc_dointvec_userhz_jiffies(table, write, buffer, lenp, ppos)                    
+#define spl_proc_dointvec_ms_jiffies(table,write,filp,buffer,lenp,ppos)      \
+       proc_dointvec_ms_jiffies(table, write, buffer, lenp, ppos)                    
+#define spl_proc_doulongvec_minmax(table, write, filp, buffer, lenp, ppos)        \
+       proc_doulongvec_minmax(table, write, buffer, lenp, ppos)
+#define spl_proc_doulongvec_ms_jiffies_minmax(table,write,filp,buffer,lenp,ppos)  \
+       proc_doulongvec_ms_jiffies_minmax(table, write, buffer, lenp, ppos)
+                                                                           
+#else /* HAVE_5ARGS_PROC_HANDLER */                                         
+                                                                           
+#define SPL_PROC_HANDLER(proc_handler)                                       \
+static int                                                                   \
+proc_handler(struct ctl_table *table, int write, struct file *filp,          \
+             void __user *buffer, size_t *lenp, loff_t *ppos)              
+                                                                           
+#define spl_proc_dostring(table, write, filp, buffer, lenp, ppos)            \
+       proc_dostring(table, write, filp, buffer, lenp, ppos)              
+#define spl_proc_dointvec(table, write, filp, buffer, lenp, ppos)            \
+       proc_dointvec(table, write, filp, buffer, lenp, ppos)
+#define spl_proc_dointvec_minmax(table, write, filp, buffer, lenp, ppos)     \
+       proc_dointvec_minmax(table, write, filp, buffer, lenp, ppos)
+#define spl_proc_dointvec_jiffies(table, write, filp, buffer, lenp, ppos)    \
+       proc_dointvec_jiffies(table, write, filp, buffer, lenp, ppos)
+#define spl_proc_dointvec_userhz_jiffies(table,write,filp,buffer,lenp,ppos)  \
+       proc_dointvec_userhz_jiffies(table, write, filp, buffer, lenp, ppos)
+#define spl_proc_dointvec_ms_jiffies(table, write, filp, buffer, lenp, ppos) \
+       proc_dointvec_ms_jiffies(table, write, filp, buffer, lenp, ppos)
+#define spl_proc_doulongvec_minmax(table, write, filp, buffer, lenp, ppos)        \
+       proc_doulongvec_minmax(table, write, filp, buffer, lenp, ppos)
+#define spl_proc_doulongvec_ms_jiffies_minmax(table,write,filp,buffer,lenp,ppos)  \
+       proc_doulongvec_ms_jiffies_minmax(table,write,filp,buffer,lenp,ppos)
+
+
+#endif /* HAVE_5ARGS_PROC_HANDLER */
+
+#endif /* _SPL_SYSCTL_COMPAT_H */
index 89cf115c02fd09bf455cc864287ba07a68f24f5c..407a1b0c58099c083329b5e4f5e1e16d6bf0a28a 100644 (file)
@@ -19,6 +19,7 @@ extern "C" {
 #include <linux/kallsyms_compat.h>
 #include <linux/mutex_compat.h>
 #include <linux/module_compat.h>
+#include <linux/sysctl_compat.h>
 
 #ifndef HAVE_UINTPTR_T
 typedef unsigned long                  uintptr_t;
index 6458186eeb5e1bd3457d67c563e2073c9adfd385..6db4664da632d362e02a1a73396fa670ec01ae0d 100644 (file)
@@ -203,9 +203,7 @@ proc_copyout_string(char *ubuffer, int ubuffer_size,
         return size;
 }
 
-static int
-proc_dobitmasks(struct ctl_table *table, int write, struct file *filp,
-                void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_dobitmasks)
 {
         unsigned long *mask = table->data;
         int is_subsys = (mask == &spl_debug_subsys) ? 1 : 0;
@@ -246,9 +244,7 @@ proc_dobitmasks(struct ctl_table *table, int write, struct file *filp,
         RETURN(rc);
 }
 
-static int
-proc_debug_mb(struct ctl_table *table, int write, struct file *filp,
-              void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_debug_mb)
 {
         char str[32];
         int rc, len;
@@ -266,7 +262,7 @@ proc_debug_mb(struct ctl_table *table, int write, struct file *filp,
                 if (*ppos >= len)
                         rc = 0;
                 else
-                        rc = proc_copyout_string(buffer, *lenp, str + *ppos, "\n");
+                        rc = proc_copyout_string(buffer,*lenp,str+*ppos,"\n");
 
                 if (rc >= 0) {
                         *lenp = rc;
@@ -277,9 +273,7 @@ proc_debug_mb(struct ctl_table *table, int write, struct file *filp,
         RETURN(rc);
 }
 
-static int
-proc_dump_kernel(struct ctl_table *table, int write, struct file *filp,
-                 void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_dump_kernel)
 {
        ENTRY;
 
@@ -293,9 +287,7 @@ proc_dump_kernel(struct ctl_table *table, int write, struct file *filp,
         RETURN(0);
 }
 
-static int
-proc_force_bug(struct ctl_table *table, int write, struct file *filp,
-               void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_force_bug)
 {
        ENTRY;
 
@@ -310,9 +302,7 @@ proc_force_bug(struct ctl_table *table, int write, struct file *filp,
        RETURN(0);
 }
 
-static int
-proc_console_max_delay_cs(struct ctl_table *table, int write, struct file *filp,
-                          void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_console_max_delay_cs)
 {
         int rc, max_delay_cs;
         struct ctl_table dummy = *table;
@@ -324,7 +314,7 @@ proc_console_max_delay_cs(struct ctl_table *table, int write, struct file *filp,
 
         if (write) {
                 max_delay_cs = 0;
-                rc = proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+                rc = spl_proc_dointvec(&dummy,write,filp,buffer,lenp,ppos);
                 if (rc < 0)
                         RETURN(rc);
 
@@ -338,15 +328,13 @@ proc_console_max_delay_cs(struct ctl_table *table, int write, struct file *filp,
                 spl_console_max_delay = d;
         } else {
                 max_delay_cs = (spl_console_max_delay * 100) / HZ;
-                rc = proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+                rc = spl_proc_dointvec(&dummy,write,filp,buffer,lenp,ppos);
         }
 
         RETURN(rc);
 }
 
-static int
-proc_console_min_delay_cs(struct ctl_table *table, int write, struct file *filp,
-                          void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_console_min_delay_cs)
 {
         int rc, min_delay_cs;
         struct ctl_table dummy = *table;
@@ -358,7 +346,7 @@ proc_console_min_delay_cs(struct ctl_table *table, int write, struct file *filp,
 
         if (write) {
                 min_delay_cs = 0;
-                rc = proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+                rc = spl_proc_dointvec(&dummy,write,filp,buffer,lenp,ppos);
                 if (rc < 0)
                         RETURN(rc);
 
@@ -372,15 +360,13 @@ proc_console_min_delay_cs(struct ctl_table *table, int write, struct file *filp,
                 spl_console_min_delay = d;
         } else {
                 min_delay_cs = (spl_console_min_delay * 100) / HZ;
-                rc = proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+                rc = spl_proc_dointvec(&dummy,write,filp,buffer,lenp,ppos);
         }
 
         RETURN(rc);
 }
 
-static int
-proc_console_backoff(struct ctl_table *table, int write, struct file *filp,
-                     void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_console_backoff)
 {
         int rc, backoff;
         struct ctl_table dummy = *table;
@@ -391,7 +377,7 @@ proc_console_backoff(struct ctl_table *table, int write, struct file *filp,
 
         if (write) {
                 backoff = 0;
-                rc = proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+                rc = spl_proc_dointvec(&dummy,write,filp,buffer,lenp,ppos);
                 if (rc < 0)
                         RETURN(rc);
 
@@ -401,16 +387,14 @@ proc_console_backoff(struct ctl_table *table, int write, struct file *filp,
                 spl_console_backoff = backoff;
         } else {
                 backoff = spl_console_backoff;
-                rc = proc_dointvec(&dummy, write, filp, buffer, lenp, ppos);
+                rc = spl_proc_dointvec(&dummy,write,filp,buffer,lenp,ppos);
         }
 
         RETURN(rc);
 }
 
 #ifdef DEBUG_KMEM
-static int
-proc_domemused(struct ctl_table *table, int write, struct file *filp,
-               void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_domemused)
 {
         int rc = 0;
         unsigned long min = 0, max = ~0, val;
@@ -430,17 +414,15 @@ proc_domemused(struct ctl_table *table, int write, struct file *filp,
 # else
                 val = atomic_read((atomic_t *)table->data);
 # endif /* HAVE_ATOMIC64_T */
-                rc = proc_doulongvec_minmax(&dummy, write, filp,
-                                            buffer, lenp, ppos);
+                rc = spl_proc_doulongvec_minmax(&dummy, write, filp,
+                                                buffer, lenp, ppos);
         }
 
         RETURN(rc);
 }
 #endif /* DEBUG_KMEM */
 
-static int
-proc_dohostid(struct ctl_table *table, int write, struct file *filp,
-              void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_dohostid)
 {
         int len, rc = 0;
         int32_t val;
@@ -448,7 +430,7 @@ proc_dohostid(struct ctl_table *table, int write, struct file *filp,
         ENTRY;
 
         if (write) {
-                /* We can't use proc_doulongvec_minmax() in the write
+                /* We can't use spl_proc_doulongvec_minmax() in the write
                  * case hear because hostid while a hex value has no
                  * leading 0x which confuses the helper function. */
                 rc = proc_copyin_string(str, sizeof(str), buffer, *lenp);
@@ -469,7 +451,7 @@ proc_dohostid(struct ctl_table *table, int write, struct file *filp,
                 if (*ppos >= len)
                         rc = 0;
                 else
-                        rc = proc_copyout_string(buffer, *lenp, str + *ppos, "\n");
+                        rc = proc_copyout_string(buffer,*lenp,str+*ppos,"\n");
 
                 if (rc >= 0) {
                         *lenp = rc;
@@ -481,10 +463,8 @@ proc_dohostid(struct ctl_table *table, int write, struct file *filp,
 }
 
 #ifndef HAVE_KALLSYMS_LOOKUP_NAME
-static int
-proc_dokallsyms_lookup_name(struct ctl_table *table, int write,
-                           struct file *filp, void __user *buffer,
-                           size_t *lenp, loff_t *ppos) {
+SPL_PROC_HANDLER(proc_dokallsyms_lookup_name)
+{
         int len, rc = 0;
         char *end, str[32];
        ENTRY;
@@ -494,7 +474,7 @@ proc_dokallsyms_lookup_name(struct ctl_table *table, int write,
                if (spl_kallsyms_lookup_name_fn != SYMBOL_POISON)
                        RETURN(-EEXIST);
 
-               /* We can't use proc_doulongvec_minmax() in the write
+               /* We can't use spl_proc_doulongvec_minmax() in the write
                 * case hear because the address while a hex value has no
                 * leading 0x which confuses the helper function. */
                 rc = proc_copyin_string(str, sizeof(str), buffer, *lenp);
@@ -525,9 +505,7 @@ proc_dokallsyms_lookup_name(struct ctl_table *table, int write,
 }
 #endif /* HAVE_KALLSYMS_LOOKUP_NAME */
 
-static int
-proc_doavailrmem(struct ctl_table *table, int write, struct file *filp,
-                 void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_doavailrmem)
 {
         int len, rc = 0;
        char str[32];
@@ -536,11 +514,12 @@ proc_doavailrmem(struct ctl_table *table, int write, struct file *filp,
         if (write) {
                 *ppos += *lenp;
         } else {
-               len = snprintf(str, sizeof(str), "%lu", (unsigned long)availrmem);
+               len = snprintf(str, sizeof(str), "%lu",
+                              (unsigned long)availrmem);
                if (*ppos >= len)
                        rc = 0;
                else
-                       rc = proc_copyout_string(buffer, *lenp, str + *ppos, "\n");
+                       rc = proc_copyout_string(buffer,*lenp,str+*ppos,"\n");
 
                if (rc >= 0) {
                        *lenp = rc;
@@ -551,9 +530,7 @@ proc_doavailrmem(struct ctl_table *table, int write, struct file *filp,
         RETURN(rc);
 }
 
-static int
-proc_dofreemem(struct ctl_table *table, int write, struct file *filp,
-               void __user *buffer, size_t *lenp, loff_t *ppos)
+SPL_PROC_HANDLER(proc_dofreemem)
 {
         int len, rc = 0;
        char str[32];
@@ -566,7 +543,7 @@ proc_dofreemem(struct ctl_table *table, int write, struct file *filp,
                if (*ppos >= len)
                        rc = 0;
                else
-                       rc = proc_copyout_string(buffer, *lenp, str + *ppos, "\n");
+                       rc = proc_copyout_string(buffer,*lenp,str+*ppos,"\n");
 
                if (rc >= 0) {
                        *lenp = rc;
@@ -648,7 +625,7 @@ slab_seq_next(struct seq_file *f, void *p, loff_t *pos)
 
         ++*pos;
         RETURN((skc->skc_list.next == &spl_kmem_cache_list) ?
-              NULL : list_entry(skc->skc_list.next, spl_kmem_cache_t, skc_list));
+              NULL : list_entry(skc->skc_list.next,spl_kmem_cache_t,skc_list));
 }
 
 static void
index 06e5766f154cd5bbf3b4ceafd63936713340beaf..a820bccbb3907a76a59459efb1f6c9e7d36a6662 100644 (file)
@@ -30,6 +30,9 @@
 /* device_create wants 5 args */
 #undef HAVE_5ARGS_DEVICE_CREATE
 
+/* proc_handler() wants 5 args */
+#undef HAVE_5ARGS_PROC_HANDLER
+
 /* kernel defines atomic64_cmpxchg */
 #undef HAVE_ATOMIC64_CMPXCHG