Index: src/apps/kernel/linux/module.mk.in
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/apps/kernel/linux/module.mk.in,v
retrieving revision 1.6
diff -u -a -p -r1.6 module.mk.in
--- src/apps/kernel/linux/module.mk.in	15 Feb 2008 19:17:24 -0000	1.6
+++ src/apps/kernel/linux/module.mk.in	15 Apr 2008 16:34:43 -0000
@@ -1,5 +1,7 @@
 DIR := src/apps/kernel/linux
 
+PVFS2_SEGV_BACKTRACE = @PVFS2_SEGV_BACKTRACE@
+
 KERNAPPSRC += \
 	$(DIR)/pvfs2-client.c 
 
@@ -17,6 +19,10 @@ endif
 # get kernel interface defines, and sysint client.h
 MODCFLAGS_$(DIR)/pvfs2-client-core.c = \
   -I$(srcdir)/src/kernel/linux-2.6
+
+ifdef PVFS2_SEGV_BACKTRACE
+	MODCFLAGS_$(DIR)/pvfs2-client-core.c += -D__PVFS2_SEGV_BACKTRACE__
+endif
 
 # explicitly uses pthreads both threaded and not-threaded versions, even if
 # threading is turned off in the rest of libpvfs
Index: src/apps/kernel/linux/pvfs2-client-core.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/apps/kernel/linux/pvfs2-client-core.c,v
retrieving revision 1.92
diff -u -a -p -r1.92 pvfs2-client-core.c
--- src/apps/kernel/linux/pvfs2-client-core.c	6 Mar 2008 20:40:59 -0000	1.92
+++ src/apps/kernel/linux/pvfs2-client-core.c	15 Apr 2008 16:34:43 -0000
@@ -15,6 +15,12 @@
 #include <signal.h>
 #include <getopt.h>
 
+#ifdef __PVFS2_SEGV_BACKTRACE__
+#include <execinfo.h>
+#define __USE_GNU
+#include <ucontext.h>
+#endif
+
 #include "pvfs2.h"
 #include "gossip.h"
 #include "job.h"
@@ -259,9 +265,39 @@ do {                                    
 
 static void client_segfault_handler(int signum)
 {
+#ifdef __PVFS2_SEGV_BACKTRACE__
+    void *trace[16];
+    char **messages = (char **)NULL;
+    int i, trace_size = 0;
+    ucontext_t *uc = (ucontext_t *)secret;
+
+    /* Do something useful with siginfo_t */
+    if (sig == SIGSEGV)
+    {
+        gossip_err("PVFS2 server: signal %d, faulty address is %p, " 
+            "from %p\n", sig, info->si_addr, 
+            (void*)uc->uc_mcontext.gregs[REG_INSTRUCTION_POINTER]);
+    }
+    else
+    {
+        gossip_err("PVFS2 server: signal %d\n", sig);
+    }
+
+    trace_size = backtrace(trace, 16);
+    /* overwrite sigaction with caller's address */
+    trace[1] = (void *) uc->uc_mcontext.gregs[REG_INSTRUCTION_POINTER];
+
+    messages = backtrace_symbols(trace, trace_size);
+    /* skip first stack frame (points here) */
+    for (i=1; i<trace_size; ++i)
+        gossip_err("[bt] %s\n", messages[i]);
+
+    signal_recvd_flag = sig;
+#else
     gossip_err("pvfs2-client-core: caught signal %d\n", signum);
     gossip_disable();
-    abort();
+#endif
+    kill(0, signum);
 }
 
 static void client_core_sig_handler(int signum)
