diff options
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 33 | 
1 files changed, 20 insertions, 13 deletions
| diff --git a/fs/proc/array.c b/fs/proc/array.c index e6d7f41b6684..004077f1a7bf 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -96,22 +96,29 @@  #include <asm/processor.h>  #include "internal.h" -static inline void task_name(struct seq_file *m, struct task_struct *p) +void proc_task_name(struct seq_file *m, struct task_struct *p, bool escape)  {  	char *buf;  	size_t size; -	char tcomm[sizeof(p->comm)]; +	char tcomm[64];  	int ret; -	get_task_comm(tcomm, p); - -	seq_puts(m, "Name:\t"); +	if (p->flags & PF_WQ_WORKER) +		wq_worker_comm(tcomm, sizeof(tcomm), p); +	else +		__get_task_comm(tcomm, sizeof(tcomm), p);  	size = seq_get_buf(m, &buf); -	ret = string_escape_str(tcomm, buf, size, ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\"); -	seq_commit(m, ret < size ? ret : -1); +	if (escape) { +		ret = string_escape_str(tcomm, buf, size, +					ESCAPE_SPACE | ESCAPE_SPECIAL, "\n\\"); +		if (ret >= size) +			ret = -1; +	} else { +		ret = strscpy(buf, tcomm, size); +	} -	seq_putc(m, '\n'); +	seq_commit(m, ret);  }  /* @@ -390,7 +397,10 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,  {  	struct mm_struct *mm = get_task_mm(task); -	task_name(m, task); +	seq_puts(m, "Name:\t"); +	proc_task_name(m, task, true); +	seq_putc(m, '\n'); +  	task_state(m, ns, pid, task);  	if (mm) { @@ -425,7 +435,6 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  	u64 cutime, cstime, utime, stime;  	u64 cgtime, gtime;  	unsigned long rsslim = 0; -	char tcomm[sizeof(task->comm)];  	unsigned long flags;  	state = *get_task_state(task); @@ -452,8 +461,6 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  		}  	} -	get_task_comm(tcomm, task); -  	sigemptyset(&sigign);  	sigemptyset(&sigcatch);  	cutime = cstime = utime = stime = 0; @@ -520,7 +527,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,  	seq_put_decimal_ull(m, "", pid_nr_ns(pid, ns));  	seq_puts(m, " ("); -	seq_puts(m, tcomm); +	proc_task_name(m, task, false);  	seq_puts(m, ") ");  	seq_putc(m, state);  	seq_put_decimal_ll(m, " ", ppid); |