--- clean-fixup.1/fs/exec.c.orig 2004-08-09 10:25:27.000000000 -0700 +++ clean-fixup.1/fs/exec.c 2004-08-09 10:27:25.000000000 -0700 @@ -1209,7 +1209,7 @@ EXPORT_SYMBOL(set_binfmt); * name into corename, which must have space for at least * CORENAME_MAX_SIZE bytes plus one byte for the zero terminator. */ -void format_corename(char *corename, const char *pattern, long signr) +static void format_corename(char *corename, const char *pattern, long signr) { const char *pat_ptr = pattern; char *out_ptr = corename; @@ -1217,6 +1217,10 @@ void format_corename(char *corename, con int rc; int pid_in_pattern = 0; + /* + * the format is controlled by sysctl, which uses lock_kernel() + */ + lock_kernel(); /* Repeat as long as we have more pattern to process and more output space */ while (*pat_ptr) { @@ -1317,6 +1321,8 @@ void format_corename(char *corename, con } out: *out_ptr = 0; + + unlock_kernel(); } static void zap_threads (struct mm_struct *mm) @@ -1373,7 +1379,6 @@ int do_coredump(long signr, int exit_cod struct file * file; int retval = 0; - lock_kernel(); binfmt = current->binfmt; if (!binfmt || !binfmt->core_dump) goto fail; @@ -1418,6 +1423,5 @@ close_fail: fail_unlock: complete_all(&mm->core_done); fail: - unlock_kernel(); return retval; }