coredump: format_corename: fix the "core_uses_pid" logic
Subsystems (2)
PATCH 1/1 coredump: format_corename: fix the "core_uses_pid" logic
I don't understand why the multi-thread coredump implies the core_uses_pid behaviour, but we shouldn't use mm->mm_users for that. This counter can be incremented by get_task_mm(). Use the valued returned by coredump_wait() instead.
Also, remove the "const char *pattern" argument, format_corename() can use core_pattern directly.
Signed-off-by Oleg Nesterov <[email protected]>
fs/exec.c renamed from fs/exec.c~FORMAT_CORENAME +5 -8
@@ -1373,17 +1373,14 @@ 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. */ -static int format_corename (char *corename,const char *pattern,long signr) +static int format_corename (char *corename,int nr_threads,long signr) { -const char *pat_ptr = pattern; +const char *pat_ptr = core_pattern; +int ispipe = (*pat_ptr =='|' );char *out_ptr = corename;char *const out_end = corename +CORENAME_MAX_SIZE ;int rc;int pid_in_pattern =0 ; -int ispipe =0 ; - -if (*pattern =='|' ) - ispipe =1 ;/* Repeat as long as we have more pattern to process and more output space */
@@ -1484,7 +1481,7 @@ static int format_corename(char *corenam* and core_uses_pid is set, then .%pid will be appended to * the filename. Do not do this for piped commands. */ if (!ispipe && !pid_in_pattern - && (core_uses_pid ||atomic_read (¤t->mm->mm_users) !=1 )) { + && (core_uses_pid || nr_threads)) { rc =snprintf (out_ptr, out_end - out_ptr,".%d" ,task_tgid_vnr (current));if (rc > out_end - out_ptr)
@@ -1748,7 +1745,7 @@ int do_coredump(long signr, int exit_cod* uses lock_kernel() */ lock_kernel (); - ispipe =format_corename (corename, core_pattern, signr); + ispipe =format_corename (corename, retval, signr);unlock_kernel ();/* * Don't bother to check the RLIMIT_CORE value if core_pattern points