--- openafs.orig/src/bozo/bnode.c
+++ openafs/src/bozo/bnode.c
@@ -28,6 +28,7 @@
 #include <time.h>
 #endif
 #include <sys/stat.h>
+#include <dirent.h>
 
 #ifdef HAVE_STRING_H
 #include <string.h>
@@ -105,13 +106,45 @@
     char tbuffer[256];
     struct stat tstat;
     register afs_int32 code;
+    char *corefile = NULL;
 #ifdef BOZO_SAVE_CORES
     struct timeval Start;
     struct tm *TimeFields;
     char FileName[256];
 #endif
 
+    /* Linux always appends the PID to core dumps from threaded processes, so
+     * we have to scan the directory to find core files under another name. */
     code = stat(AFSDIR_SERVER_CORELOG_FILEPATH, &tstat);
+    if (code) {
+        DIR *logdir;
+        struct dirent *file;
+        char *p;
+        size_t length;
+        unsigned long pid;
+
+        logdir = opendir(AFSDIR_LOGS_DIR);
+        if (logdir == NULL)
+            return;
+        while ((file = readdir(logdir)) != NULL) {
+            if (strncmp(file->d_name, "core.", 5) != 0)
+                continue;
+            pid = atol(file->d_name + 5);
+            if (pid == aproc->pid) {
+                length = strlen(AFSDIR_LOGS_DIR) + strlen(file->d_name) + 2;
+                corefile = malloc(length);
+                if (corefile == NULL) {
+                    closedir(logdir);
+                    return;
+                }
+                snprintf(corefile, length, "%s/%s", AFSDIR_LOGS_DIR,
+                         file->d_name);
+                code = 0;
+                break;
+            }
+        }
+        closedir(logdir);
+    }
     if (code)
 	return;
 
@@ -124,7 +157,12 @@
 	    TimeFields->tm_hour, TimeFields->tm_min, TimeFields->tm_sec);
     strcpy(tbuffer, FileName);
 #endif
-    code = renamefile(AFSDIR_SERVER_CORELOG_FILEPATH, tbuffer);
+    if (corefile == NULL)
+        code = renamefile(AFSDIR_SERVER_CORELOG_FILEPATH, tbuffer);
+    else {
+        code = renamefile(corefile, tbuffer);
+        free(corefile);
+    }
 }
 
 int
