- libcfs_catastrophe = 1;
- libcfs_debug_msg(msgdata, "LBUG\n");
-
- if (in_interrupt()) {
- panic("LBUG in interrupt.\n");
- /* not reached */
- }
-
- 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);
- while (1)
- schedule();
+#ifdef CONFIG_ARCH_STACKWALK
+ static unsigned long entries[MAX_ST_ENTRIES];
+ unsigned int i, nr_entries;
+
+ if (!task_dump_stack)
+ task_dump_stack = (stack_trace_save_tsk_t *)
+ symbol_get("stack_trace_save_tsk");
+
+ spin_lock(&st_lock);
+ pr_info("Pid: %d, comm: %.20s %s %s\n", tsk->pid, tsk->comm,
+ init_utsname()->release, init_utsname()->version);
+ pr_info("Call Trace TBD:\n");
+ if (task_dump_stack) {
+ nr_entries = task_dump_stack(tsk, entries, MAX_ST_ENTRIES, 0);
+ for (i = 0; i < nr_entries; i++)
+ pr_info("[<0>] %pB\n", (void *)entries[i]);
+ }
+ spin_unlock(&st_lock);
+#else
+ struct stack_trace trace;
+ static unsigned long entries[MAX_ST_ENTRIES];
+
+ trace.nr_entries = 0;
+ trace.max_entries = MAX_ST_ENTRIES;
+ trace.entries = entries;
+ trace.skip = 0;
+
+ spin_lock(&st_lock);
+ pr_info("Pid: %d, comm: %.20s %s %s\n", tsk->pid, tsk->comm,
+ init_utsname()->release, init_utsname()->version);
+ pr_info("Call Trace:\n");
+ save_stack_trace_tsk(tsk, &trace);
+ print_stack_trace(&trace, 0);
+ spin_unlock(&st_lock);
+#endif