diff options
Diffstat (limited to 'fs/proc/array.c')
| -rw-r--r-- | fs/proc/array.c | 58 | 
1 files changed, 26 insertions, 32 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index 72391b3f6927..0ceb3b6b37e7 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);  }  /* @@ -261,7 +268,7 @@ static inline void task_sig(struct seq_file *m, struct task_struct *p)  	unsigned long flags;  	sigset_t pending, shpending, blocked, ignored, caught;  	int num_threads = 0; -	unsigned long qsize = 0; +	unsigned int qsize = 0;  	unsigned long qlim = 0;  	sigemptyset(&pending); @@ -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); @@ -702,25 +709,22 @@ out:  static int children_seq_show(struct seq_file *seq, void *v)  { -	struct inode *inode = seq->private; -	pid_t pid; - -	pid = pid_nr_ns(v, inode->i_sb->s_fs_info); -	seq_printf(seq, "%d ", pid); +	struct inode *inode = file_inode(seq->file); +	seq_printf(seq, "%d ", pid_nr_ns(v, proc_pid_ns(inode)));  	return 0;  }  static void *children_seq_start(struct seq_file *seq, loff_t *pos)  { -	return get_children_pid(seq->private, NULL, *pos); +	return get_children_pid(file_inode(seq->file), NULL, *pos);  }  static void *children_seq_next(struct seq_file *seq, void *v, loff_t *pos)  {  	struct pid *pid; -	pid = get_children_pid(seq->private, v, *pos + 1); +	pid = get_children_pid(file_inode(seq->file), v, *pos + 1);  	put_pid(v);  	++*pos; @@ -741,17 +745,7 @@ static const struct seq_operations children_seq_ops = {  static int children_seq_open(struct inode *inode, struct file *file)  { -	struct seq_file *m; -	int ret; - -	ret = seq_open(file, &children_seq_ops); -	if (ret) -		return ret; - -	m = file->private_data; -	m->private = inode; - -	return ret; +	return seq_open(file, &children_seq_ops);  }  const struct file_operations proc_tid_children_operations = {  |