*
* 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.
+ * http://www.gnu.org/licenses/gpl-2.0.html
*
* GPL HEADER END
*/
#include <linux/kallsyms.h>
-char lnet_upcall[1024] = "/usr/lib/lustre/lnet_upcall";
char lnet_debug_log_upcall[1024] = "/usr/lib/lustre/lnet_debug_log_upcall";
/**
EXIT;
}
-void libcfs_run_upcall(char **argv)
-{
- int rc;
- int argc;
- char *envp[] = {
- "HOME=/",
- "PATH=/sbin:/bin:/usr/sbin:/usr/bin",
- NULL};
- ENTRY;
-
- argv[0] = lnet_upcall;
- argc = 1;
- while (argv[argc] != NULL)
- argc++;
-
- LASSERT(argc >= 2);
-
- rc = call_usermodehelper(argv[0], argv, envp, 1);
- if (rc < 0 && rc != -ENOENT) {
- CERROR("Error %d invoking LNET upcall %s %s%s%s%s%s%s%s%s; "
- "check /proc/sys/lnet/upcall\n",
- rc, argv[0], argv[1],
- argc < 3 ? "" : ",", argc < 3 ? "" : argv[2],
- argc < 4 ? "" : ",", argc < 4 ? "" : argv[3],
- argc < 5 ? "" : ",", argc < 5 ? "" : argv[4],
- argc < 6 ? "" : ",...");
- } else {
- CDEBUG(D_HA, "Invoked LNET upcall %s %s%s%s%s%s%s%s%s\n",
- argv[0], argv[1],
- argc < 3 ? "" : ",", argc < 3 ? "" : argv[2],
- argc < 4 ? "" : ",", argc < 4 ? "" : argv[3],
- argc < 5 ? "" : ",", argc < 5 ? "" : argv[4],
- argc < 6 ? "" : ",...");
- }
-}
-
-void libcfs_run_lbug_upcall(struct libcfs_debug_msg_data *msgdata)
-{
- char *argv[6];
- char buf[32];
-
- ENTRY;
- snprintf (buf, sizeof buf, "%d", msgdata->msg_line);
-
- argv[1] = "LBUG";
- argv[2] = (char *)msgdata->msg_file;
- argv[3] = (char *)msgdata->msg_fn;
- argv[4] = buf;
- argv[5] = NULL;
-
- libcfs_run_upcall (argv);
-}
-EXPORT_SYMBOL(libcfs_run_lbug_upcall);
-
/* coverity[+kill] */
void lbug_with_loc(struct libcfs_debug_msg_data *msgdata)
{
libcfs_debug_dumpstack(NULL);
if (!libcfs_panic_on_lbug)
libcfs_debug_dumplog();
- libcfs_run_lbug_upcall(msgdata);
if (libcfs_panic_on_lbug)
panic("LBUG");
- set_task_state(current, TASK_UNINTERRUPTIBLE);
+ set_current_state(TASK_UNINTERRUPTIBLE);
while (1)
schedule();
}
#include <linux/nmi.h>
#include <asm/stacktrace.h>
+#ifdef HAVE_STACKTRACE_OPS
#ifdef HAVE_STACKTRACE_WARNING
static void
print_trace_warning_symbol(void *data, char *msg, unsigned long symbol)
{
- printk("%s", (char *)data);
+ printk("%s", (char *)data);
print_symbol(msg, symbol);
printk("\n");
}
.walk_stack = print_context_stack,
#endif
};
+#endif /* HAVE_STACKTRACE_OPS */
static void libcfs_call_trace(struct task_struct *tsk)
{
+#ifdef HAVE_STACKTRACE_OPS
+ printk("Pid: %d, comm: %.20s\n", tsk->pid, tsk->comm);
+ printk("\nCall Trace:\n");
dump_trace(tsk, NULL, NULL,
#ifdef HAVE_DUMP_TRACE_ADDRESS
0,
#endif /* HAVE_DUMP_TRACE_ADDRESS */
&print_trace_ops, NULL);
printk("\n");
+#else /* !HAVE_STACKTRACE_OPS */
+ if (tsk == current)
+ dump_stack();
+ else
+ CWARN("can't show stack: kernel doesn't export show_task\n");
+#endif /* HAVE_STACKTRACE_OPS */
}
#else /* !CONFIG_X86 */
static void libcfs_call_trace(struct task_struct *tsk)
{
- if ((tsk == NULL) || (tsk == current))
+ if (tsk == current)
dump_stack();
else
CWARN("can't show stack: kernel doesn't export show_task\n");
void libcfs_debug_dumpstack(struct task_struct *tsk)
{
- /* dump_stack() */
- /* show_trace() */
- if (tsk == NULL)
- tsk = current;
- printk("Pid: %d, comm: %.20s\n", tsk->pid, tsk->comm);
- /* show_trace_log_lvl() */
- printk("\nCall Trace:\n");
- libcfs_call_trace(tsk);
+ libcfs_call_trace(tsk ?: current);
}
EXPORT_SYMBOL(libcfs_debug_dumpstack);
}
static struct notifier_block libcfs_panic_notifier = {
- notifier_call : panic_notifier,
- next : NULL,
- priority : 10000
+ .notifier_call = panic_notifier,
+ .next = NULL,
+ .priority = 10000
};
void libcfs_register_panic_notifier(void)