Whamcloud - gitweb
LU-1402 libcfs: CFS_ALLOC_HIGH is __GFP_HIGHMEM
[fs/lustre-release.git] / libcfs / libcfs / linux / linux-debug.c
index f8dab0f..0f61f2e 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2012, Whamcloud, Inc.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
  * Author: Phil Schwan <phil@clusterfs.com>
  */
 
-#ifndef EXPORT_SYMTAB
-# define EXPORT_SYMTAB
-#endif
-
 #ifndef AUTOCONF_INCLUDED
 #include <linux/config.h>
 #endif
@@ -73,9 +69,7 @@
 
 #include "tracefile.h"
 
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
 #include <linux/kallsyms.h>
-#endif
 
 char lnet_upcall[1024] = "/usr/lib/lustre/lnet_upcall";
 char lnet_debug_log_upcall[1024] = "/usr/lib/lustre/lnet_debug_log_upcall";
@@ -151,17 +145,17 @@ void libcfs_run_upcall(char **argv)
         }
 }
 
-void libcfs_run_lbug_upcall(const char *file, const char *fn, const int line)
+void libcfs_run_lbug_upcall(struct libcfs_debug_msg_data *msgdata)
 {
         char *argv[6];
         char buf[32];
 
         ENTRY;
-        snprintf (buf, sizeof buf, "%d", line);
+        snprintf (buf, sizeof buf, "%d", msgdata->msg_line);
 
         argv[1] = "LBUG";
-        argv[2] = (char *)file;
-        argv[3] = (char *)fn;
+        argv[2] = (char *)msgdata->msg_file;
+        argv[3] = (char *)msgdata->msg_fn;
         argv[4] = buf;
         argv[5] = NULL;
 
@@ -169,22 +163,22 @@ void libcfs_run_lbug_upcall(const char *file, const char *fn, const int line)
 }
 
 #ifdef __arch_um__
-void lbug_with_loc(const char *file, const char *func, const int line)
+void lbug_with_loc(struct libcfs_debug_msg_data *msgdata)
 {
         libcfs_catastrophe = 1;
-        libcfs_debug_msg(NULL, 0, D_EMERG, file, func, line,
-                         "LBUG - trying to dump log to %s\n", debug_file_path);
+        libcfs_debug_msg(msgdata, "LBUG - trying to dump log to %s\n",
+                         libcfs_debug_file_path);
         libcfs_debug_dumplog();
-        libcfs_run_lbug_upcall(file, func, line);
+        libcfs_run_lbug_upcall(msgdata);
         asm("int $3");
         panic("LBUG");
 }
 #else
 /* coverity[+kill] */
-void lbug_with_loc(const char *file, const char *func, const int line)
+void lbug_with_loc(struct libcfs_debug_msg_data *msgdata)
 {
         libcfs_catastrophe = 1;
-        libcfs_debug_msg(NULL, 0, D_EMERG, file, func, line, "LBUG\n");
+        libcfs_debug_msg(msgdata, "LBUG\n");
 
         if (in_interrupt()) {
                 panic("LBUG in interrupt.\n");
@@ -194,7 +188,7 @@ void lbug_with_loc(const char *file, const char *func, const int line)
         libcfs_debug_dumpstack(NULL);
         if (!libcfs_panic_on_lbug)
                 libcfs_debug_dumplog();
-        libcfs_run_lbug_upcall(file, func, line);
+        libcfs_run_lbug_upcall(msgdata);
         if (libcfs_panic_on_lbug)
                 panic("LBUG");
         set_task_state(current, TASK_UNINTERRUPTIBLE);
@@ -209,6 +203,7 @@ void lbug_with_loc(const char *file, const char *func, const int line)
 #include <linux/nmi.h>
 #include <asm/stacktrace.h>
 
+#ifdef HAVE_STACKTRACE_WARNING
 static void
 print_trace_warning_symbol(void *data, char *msg, unsigned long symbol)
 {
@@ -221,6 +216,7 @@ static void print_trace_warning(void *data, char *msg)
 {
        printk("%s%s\n", (char *)data, msg);
 }
+#endif
 
 static int print_trace_stack(void *data, char *name)
 {
@@ -246,10 +242,15 @@ static void print_trace_address(void *data, unsigned long addr)
 }
 
 static DUMP_TRACE_CONST struct stacktrace_ops print_trace_ops = {
+#ifdef HAVE_STACKTRACE_WARNING
        .warning = print_trace_warning,
        .warning_symbol = print_trace_warning_symbol,
+#endif
        .stack = print_trace_stack,
        .address = print_trace_address,
+#ifdef STACKTRACE_OPS_HAVE_WALK_STACK
+       .walk_stack = print_context_stack,
+#endif
 };
 #endif
 
@@ -269,9 +270,9 @@ void libcfs_debug_dumpstack(struct task_struct *tsk)
         /* show_trace_log_lvl() */
        printk("\nCall Trace:\n");
        dump_trace(tsk, NULL, NULL,
-#ifdef HAVE_TRACE_ADDRESS_RELIABLE
+#ifdef HAVE_DUMP_TRACE_ADDRESS
                    0,
-#endif /* HAVE_TRACE_ADDRESS_RELIABLE */
+#endif /* HAVE_DUMP_TRACE_ADDRESS */
                    &print_trace_ops, NULL);
        printk("\n");
 #elif defined(HAVE_SHOW_TASK)
@@ -310,7 +311,7 @@ static int panic_notifier(struct notifier_block *self, unsigned long unused1,
          * console on the rare cases it is ever triggered. */
 
         if (in_interrupt()) {
-                trace_debug_print();
+                cfs_trace_debug_print();
         } else {
                 while (current->lock_depth >= 0)
                         unlock_kernel();
@@ -329,20 +330,12 @@ static struct notifier_block libcfs_panic_notifier = {
 
 void libcfs_register_panic_notifier(void)
 {
-#ifdef HAVE_ATOMIC_PANIC_NOTIFIER
         atomic_notifier_chain_register(&panic_notifier_list, &libcfs_panic_notifier);
-#else
-        notifier_chain_register(&panic_notifier_list, &libcfs_panic_notifier);
-#endif
 }
 
 void libcfs_unregister_panic_notifier(void)
 {
-#ifdef HAVE_ATOMIC_PANIC_NOTIFIER
         atomic_notifier_chain_unregister(&panic_notifier_list, &libcfs_panic_notifier);
-#else
-        notifier_chain_unregister(&panic_notifier_list, &libcfs_panic_notifier);
-#endif
 }
 
 EXPORT_SYMBOL(libcfs_debug_dumpstack);