Whamcloud - gitweb
LU-506 FC15: ctl_name & strategy removed from ctl_table.
[fs/lustre-release.git] / libcfs / libcfs / linux / linux-proc.c
index ae3312a..018643a 100644 (file)
@@ -1,25 +1,43 @@
 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  * vim:expandtab:shiftwidth=8:tabstop=8:
  *
- * Copyright (C) 2001, 2002 Cluster File Systems, Inc.
- *   Author: Zach Brown <zab@zabbo.net>
- *   Author: Peter J. Braam <braam@clusterfs.com>
- *   Author: Phil Schwan <phil@clusterfs.com>
+ * GPL HEADER START
  *
- *   This file is part of Lustre, http://www.lustre.org.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
- *   Lustre is free software; you can redistribute it and/or
- *   modify it under the terms of version 2 of the GNU General Public
- *   License as published by the Free Software Foundation.
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 only,
+ * as published by the Free Software Foundation.
  *
- *   Lustre is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License version 2 for more details (a copy is included
+ * in the LICENSE file that accompanied this code).
  *
- *   You should have received a copy of the GNU General Public License
- *   along with Lustre; if not, write to the Free Software
- *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ * GPL HEADER END
+ */
+/*
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Use is subject to license terms.
+ */
+/*
+ * This file is part of Lustre, http://www.lustre.org/
+ * Lustre is a trademark of Sun Microsystems, Inc.
+ *
+ * libcfs/libcfs/linux/linux-proc.c
+ *
+ * Author: Zach Brown <zab@zabbo.net>
+ * Author: Peter J. Braam <braam@clusterfs.com>
+ * Author: Phil Schwan <phil@clusterfs.com>
  */
 
 #ifndef EXPORT_SYMTAB
 
 # define DEBUG_SUBSYSTEM S_LNET
 
-#include <libcfs/kp30.h>
+#include <libcfs/libcfs.h>
 #include <asm/div64.h>
 #include "tracefile.h"
 
+#ifdef CONFIG_SYSCTL
 static cfs_sysctl_table_header_t *lnet_table_header = NULL;
+#endif
 extern char lnet_upcall[1024];
+/**
+ * The path of debug log dump upcall script.
+ */
+extern char lnet_debug_log_upcall[1024];
 
-#define PSDEV_LNET  (0x100)
+#ifndef HAVE_SYSCTL_UNNUMBERED
+#define CTL_LNET        (0x100)
 enum {
         PSDEV_DEBUG = 1,          /* control debugging */
         PSDEV_SUBSYSTEM_DEBUG,    /* control debugging */
@@ -79,11 +104,40 @@ enum {
         PSDEV_LNET_DUMP_KERNEL,   /* snapshot kernel debug buffer to file */
         PSDEV_LNET_DAEMON_FILE,   /* spool kernel debug buffer to file */
         PSDEV_LNET_DEBUG_MB,      /* size of debug buffer */
+        PSDEV_LNET_DEBUG_LOG_UPCALL, /* debug log upcall script */
+        PSDEV_LNET_WATCHDOG_RATELIMIT,  /* ratelimit watchdog messages  */
+        PSDEV_LNET_FORCE_LBUG,    /* hook to force an LBUG */
+        PSDEV_LNET_FAIL_LOC,      /* control test failures instrumentation */
+        PSDEV_LNET_FAIL_VAL,      /* userdata for fail loc */
 };
+#else
+#define CTL_LNET                        CTL_UNNUMBERED
+#define PSDEV_DEBUG                     CTL_UNNUMBERED
+#define PSDEV_SUBSYSTEM_DEBUG           CTL_UNNUMBERED
+#define PSDEV_PRINTK                    CTL_UNNUMBERED
+#define PSDEV_CONSOLE_RATELIMIT         CTL_UNNUMBERED
+#define PSDEV_CONSOLE_MAX_DELAY_CS      CTL_UNNUMBERED
+#define PSDEV_CONSOLE_MIN_DELAY_CS      CTL_UNNUMBERED
+#define PSDEV_CONSOLE_BACKOFF           CTL_UNNUMBERED
+#define PSDEV_DEBUG_PATH                CTL_UNNUMBERED
+#define PSDEV_DEBUG_DUMP_PATH           CTL_UNNUMBERED
+#define PSDEV_LNET_UPCALL               CTL_UNNUMBERED
+#define PSDEV_LNET_MEMUSED              CTL_UNNUMBERED
+#define PSDEV_LNET_CATASTROPHE          CTL_UNNUMBERED
+#define PSDEV_LNET_PANIC_ON_LBUG        CTL_UNNUMBERED
+#define PSDEV_LNET_DUMP_KERNEL          CTL_UNNUMBERED
+#define PSDEV_LNET_DAEMON_FILE          CTL_UNNUMBERED
+#define PSDEV_LNET_DEBUG_MB             CTL_UNNUMBERED
+#define PSDEV_LNET_DEBUG_LOG_UPCALL     CTL_UNNUMBERED
+#define PSDEV_LNET_WATCHDOG_RATELIMIT   CTL_UNNUMBERED
+#define PSDEV_LNET_FORCE_LBUG           CTL_UNNUMBERED
+#define PSDEV_LNET_FAIL_LOC             CTL_UNNUMBERED
+#define PSDEV_LNET_FAIL_VAL             CTL_UNNUMBERED
+#endif
 
-static int 
-proc_call_handler(void *data, int write, 
-                  loff_t *ppos, void *buffer, size_t *lenp, 
+int
+proc_call_handler(void *data, int write,
+                  loff_t *ppos, void *buffer, size_t *lenp,
                   int (*handler)(void *data, int write,
                                  loff_t pos, void *buffer, int len))
 {
@@ -100,19 +154,9 @@ proc_call_handler(void *data, int write,
         }
         return 0;
 }
+EXPORT_SYMBOL(proc_call_handler);
 
-#define DECLARE_PROC_HANDLER(name)                      \
-static int                                              \
-LL_PROC_PROTO(name)                                     \
-{                                                       \
-        DECLARE_LL_PROC_PPOS_DECL;                      \
-                                                        \
-        return proc_call_handler(table->data, write,    \
-                                 ppos, buffer, lenp,    \
-                                 __##name);             \
-}
-
-static int __proc_dobitmasks(void *data, int write, 
+static int __proc_dobitmasks(void *data, int write,
                              loff_t pos, void *buffer, int nob)
 {
         const int     tmpstrlen = 512;
@@ -122,7 +166,7 @@ static int __proc_dobitmasks(void *data, int write,
         int           is_subsys = (mask == &libcfs_subsystem_debug) ? 1 : 0;
         int           is_printk = (mask == &libcfs_printk) ? 1 : 0;
 
-        rc = trace_allocate_string_buffer(&tmpstr, tmpstrlen);
+        rc = cfs_trace_allocate_string_buffer(&tmpstr, tmpstrlen);
         if (rc < 0)
                 return rc;
 
@@ -133,11 +177,11 @@ static int __proc_dobitmasks(void *data, int write,
                 if (pos >= rc) {
                         rc = 0;
                 } else {
-                        rc = trace_copyout_string(buffer, nob,
-                                                  tmpstr + pos, "\n");
+                        rc = cfs_trace_copyout_string(buffer, nob,
+                                                      tmpstr + pos, "\n");
                 }
         } else {
-                rc = trace_copyin_string(tmpstr, tmpstrlen, buffer, nob);
+                rc = cfs_trace_copyin_string(tmpstr, tmpstrlen, buffer, nob);
                 if (rc < 0)
                         return rc;
 
@@ -147,19 +191,22 @@ static int __proc_dobitmasks(void *data, int write,
                         *mask |= D_EMERG;
         }
 
-        trace_free_string_buffer(tmpstr, tmpstrlen);
+        cfs_trace_free_string_buffer(tmpstr, tmpstrlen);
         return rc;
 }
 
 DECLARE_PROC_HANDLER(proc_dobitmasks)
 
+static int min_watchdog_ratelimit = 0;          /* disable ratelimiting */
+static int max_watchdog_ratelimit = (24*60*60); /* limit to once per day */
+
 static int __proc_dump_kernel(void *data, int write,
                               loff_t pos, void *buffer, int nob)
 {
         if (!write)
                 return 0;
-        
-        return trace_dump_debug_buffer_usrstr(buffer, nob);
+
+        return cfs_trace_dump_debug_buffer_usrstr(buffer, nob);
 }
 
 DECLARE_PROC_HANDLER(proc_dump_kernel)
@@ -168,16 +215,16 @@ static int __proc_daemon_file(void *data, int write,
                               loff_t pos, void *buffer, int nob)
 {
         if (!write) {
-                int len = strlen(tracefile);
-                
+                int len = strlen(cfs_tracefile);
+
                 if (pos >= len)
                         return 0;
-                
-                return trace_copyout_string(buffer, nob, 
-                                            tracefile + pos, "\n");
+
+                return cfs_trace_copyout_string(buffer, nob,
+                                                cfs_tracefile + pos, "\n");
         }
-        
-        return trace_daemon_command_usrstr(buffer, nob);
+
+        return cfs_trace_daemon_command_usrstr(buffer, nob);
 }
 
 DECLARE_PROC_HANDLER(proc_daemon_file)
@@ -188,15 +235,16 @@ static int __proc_debug_mb(void *data, int write,
         if (!write) {
                 char tmpstr[32];
                 int  len = snprintf(tmpstr, sizeof(tmpstr), "%d",
-                                    trace_get_debug_mb());
+                                    cfs_trace_get_debug_mb());
 
                 if (pos >= len)
                         return 0;
-                
-                return trace_copyout_string(buffer, nob, tmpstr + pos, "\n");
+
+                return cfs_trace_copyout_string(buffer, nob, tmpstr + pos,
+                       "\n");
         }
-        
-        return trace_set_debug_mb_usrstr(buffer, nob);
+
+        return cfs_trace_set_debug_mb_usrstr(buffer, nob);
 }
 
 DECLARE_PROC_HANDLER(proc_debug_mb)
@@ -290,37 +338,55 @@ int LL_PROC_PROTO(proc_console_backoff)
         return rc;
 }
 
+int LL_PROC_PROTO(libcfs_force_lbug)
+{
+        if (write)
+                LBUG();
+        return 0;
+}
+
+int LL_PROC_PROTO(proc_fail_loc)
+{
+        int rc;
+        long old_fail_loc = cfs_fail_loc;
+
+        rc = ll_proc_dolongvec(table, write, filp, buffer, lenp, ppos);
+        if (old_fail_loc != cfs_fail_loc)
+                cfs_waitq_signal(&cfs_race_waitq);
+        return rc;
+}
+
 static cfs_sysctl_table_t lnet_table[] = {
         /*
          * NB No .strategy entries have been provided since sysctl(8) prefers
          * to go via /proc for portability.
          */
         {
-                .ctl_name = PSDEV_DEBUG,
+                INIT_CTL_NAME(PSDEV_DEBUG)
                 .procname = "debug",
                 .data     = &libcfs_debug,
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
-                .proc_handler = &proc_dobitmasks
+                .proc_handler = &proc_dobitmasks,
         },
         {
-                .ctl_name = PSDEV_SUBSYSTEM_DEBUG,
+                INIT_CTL_NAME(PSDEV_SUBSYSTEM_DEBUG)
                 .procname = "subsystem_debug",
                 .data     = &libcfs_subsystem_debug,
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
-                .proc_handler = &proc_dobitmasks
+                .proc_handler = &proc_dobitmasks,
         },
         {
-                .ctl_name = PSDEV_PRINTK,
+                INIT_CTL_NAME(PSDEV_PRINTK)
                 .procname = "printk",
                 .data     = &libcfs_printk,
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
-                .proc_handler = &proc_dobitmasks
+                .proc_handler = &proc_dobitmasks,
         },
         {
-                .ctl_name = PSDEV_CONSOLE_RATELIMIT,
+                INIT_CTL_NAME(PSDEV_CONSOLE_RATELIMIT)
                 .procname = "console_ratelimit",
                 .data     = &libcfs_console_ratelimit,
                 .maxlen   = sizeof(int),
@@ -328,21 +394,21 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_dointvec
         },
         {
-                .ctl_name = PSDEV_CONSOLE_MAX_DELAY_CS,
+                INIT_CTL_NAME(PSDEV_CONSOLE_MAX_DELAY_CS)
                 .procname = "console_max_delay_centisecs",
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
                 .proc_handler = &proc_console_max_delay_cs
         },
         {
-                .ctl_name = PSDEV_CONSOLE_MIN_DELAY_CS,
+                INIT_CTL_NAME(PSDEV_CONSOLE_MIN_DELAY_CS)
                 .procname = "console_min_delay_centisecs",
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
                 .proc_handler = &proc_console_min_delay_cs
         },
         {
-                .ctl_name = PSDEV_CONSOLE_BACKOFF,
+                INIT_CTL_NAME(PSDEV_CONSOLE_BACKOFF)
                 .procname = "console_backoff",
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
@@ -350,16 +416,16 @@ static cfs_sysctl_table_t lnet_table[] = {
         },
 
         {
-                .ctl_name = PSDEV_DEBUG_PATH,
+                INIT_CTL_NAME(PSDEV_DEBUG_PATH)
                 .procname = "debug_path",
-                .data     = debug_file_path,
-                .maxlen   = sizeof(debug_file_path),
+                .data     = libcfs_debug_file_path_arr,
+                .maxlen   = sizeof(libcfs_debug_file_path_arr),
                 .mode     = 0644,
                 .proc_handler = &proc_dostring,
         },
 
         {
-                .ctl_name = PSDEV_LNET_UPCALL,
+                INIT_CTL_NAME(PSDEV_LNET_UPCALL)
                 .procname = "upcall",
                 .data     = lnet_upcall,
                 .maxlen   = sizeof(lnet_upcall),
@@ -367,65 +433,115 @@ static cfs_sysctl_table_t lnet_table[] = {
                 .proc_handler = &proc_dostring,
         },
         {
-                .ctl_name = PSDEV_LNET_MEMUSED,
-                .procname = "memused",
+                INIT_CTL_NAME(PSDEV_LNET_DEBUG_LOG_UPCALL)
+                .procname = "debug_log_upcall",
+                .data     = lnet_debug_log_upcall,
+                .maxlen   = sizeof(lnet_debug_log_upcall),
+                .mode     = 0644,
+                .proc_handler = &proc_dostring,
+        },
+        {
+                INIT_CTL_NAME(PSDEV_LNET_MEMUSED)
+                .procname = "lnet_memused",
                 .data     = (int *)&libcfs_kmemory.counter,
                 .maxlen   = sizeof(int),
                 .mode     = 0444,
-                .proc_handler = &proc_dointvec
+                .proc_handler = &proc_dointvec,
+                INIT_STRATEGY(&sysctl_intvec)
         },
         {
-                .ctl_name = PSDEV_LNET_CATASTROPHE,
+                INIT_CTL_NAME(PSDEV_LNET_CATASTROPHE)
                 .procname = "catastrophe",
                 .data     = &libcfs_catastrophe,
                 .maxlen   = sizeof(int),
                 .mode     = 0444,
-                .proc_handler = &proc_dointvec
+                .proc_handler = &proc_dointvec,
+                INIT_STRATEGY(&sysctl_intvec)
         },
         {
-                .ctl_name = PSDEV_LNET_PANIC_ON_LBUG,
+                INIT_CTL_NAME(PSDEV_LNET_PANIC_ON_LBUG)
                 .procname = "panic_on_lbug",
                 .data     = &libcfs_panic_on_lbug,
                 .maxlen   = sizeof(int),
                 .mode     = 0644,
-                .proc_handler = &proc_dointvec
+                .proc_handler = &proc_dointvec,
+                INIT_STRATEGY(&sysctl_intvec)
         },
         {
-                .ctl_name = PSDEV_LNET_DUMP_KERNEL,
+                INIT_CTL_NAME(PSDEV_LNET_DUMP_KERNEL)
                 .procname = "dump_kernel",
+                .maxlen   = 256,
                 .mode     = 0200,
                 .proc_handler = &proc_dump_kernel,
         },
         {
-                .ctl_name = PSDEV_LNET_DAEMON_FILE,
+                INIT_CTL_NAME(PSDEV_LNET_DAEMON_FILE)
                 .procname = "daemon_file",
                 .mode     = 0644,
+                .maxlen   = 256,
                 .proc_handler = &proc_daemon_file,
         },
         {
-                .ctl_name = PSDEV_LNET_DEBUG_MB,
+                INIT_CTL_NAME(PSDEV_LNET_DEBUG_MB)
                 .procname = "debug_mb",
                 .mode     = 0644,
                 .proc_handler = &proc_debug_mb,
         },
-        {0}
+        {
+                INIT_CTL_NAME(PSDEV_LNET_WATCHDOG_RATELIMIT)
+                .procname = "watchdog_ratelimit",
+                .data     = &libcfs_watchdog_ratelimit,
+                .maxlen   = sizeof(int),
+                .mode     = 0644,
+                .proc_handler = &proc_dointvec_minmax,
+                .extra1   = &min_watchdog_ratelimit,
+                .extra2   = &max_watchdog_ratelimit,
+        },
+        {       INIT_CTL_NAME(PSDEV_LNET_FORCE_LBUG)
+                .procname = "force_lbug",
+                .data     = NULL,
+                .maxlen   = 0,
+                .mode     = 0200,
+                .proc_handler = &libcfs_force_lbug
+        },
+        {
+                INIT_CTL_NAME(PSDEV_LNET_FAIL_LOC)
+                .procname = "fail_loc",
+                .data     = &cfs_fail_loc,
+                .maxlen   = sizeof(cfs_fail_loc),
+                .mode     = 0644,
+                .proc_handler = &proc_fail_loc
+        },
+        {
+                INIT_CTL_NAME(PSDEV_LNET_FAIL_VAL)
+                .procname = "fail_val",
+                .data     = &cfs_fail_val,
+                .maxlen   = sizeof(int),
+                .mode     = 0644,
+                .proc_handler = &proc_dointvec
+        },
+        {
+                INIT_CTL_NAME(0)
+        }
 };
 
-static cfs_sysctl_table_t top_table[2] = {
+#ifdef CONFIG_SYSCTL
+static cfs_sysctl_table_t top_table[] = {
         {
-                .ctl_name = PSDEV_LNET,
+                INIT_CTL_NAME(CTL_LNET)
                 .procname = "lnet",
+                .mode     = 0555,
                 .data     = NULL,
                 .maxlen   = 0,
-                .mode     = 0555,
-                .child    = lnet_table
+                .child    = lnet_table,
         },
-        {0}
+        {
+                INIT_CTL_NAME(0)
+        }
 };
 
 int insert_proc(void)
 {
-#ifdef CONFIG_SYSCTL
         if (lnet_table_header == NULL)
                 lnet_table_header = cfs_register_sysctl_table(top_table, 0);
 #endif