diff options
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 55 | 
1 files changed, 25 insertions, 30 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 5a5a0be40e4..69078c7cef1 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -73,6 +73,7 @@  #include <linux/security.h>  #include <linux/ptrace.h>  #include <linux/tracehook.h> +#include <linux/printk.h>  #include <linux/cgroup.h>  #include <linux/cpuset.h>  #include <linux/audit.h> @@ -383,7 +384,7 @@ static int lstats_open(struct inode *inode, struct file *file)  static ssize_t lstats_write(struct file *file, const char __user *buf,  			    size_t count, loff_t *offs)  { -	struct task_struct *task = get_proc_task(file->f_dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	if (!task)  		return -ESRCH; @@ -542,13 +543,6 @@ int proc_setattr(struct dentry *dentry, struct iattr *attr)  	if (error)  		return error; -	if ((attr->ia_valid & ATTR_SIZE) && -	    attr->ia_size != i_size_read(inode)) { -		error = vmtruncate(inode, attr->ia_size); -		if (error) -			return error; -	} -  	setattr_copy(inode, attr);  	mark_inode_dirty(inode);  	return 0; @@ -609,7 +603,7 @@ static const struct inode_operations proc_def_inode_operations = {  static ssize_t proc_info_read(struct file * file, char __user * buf,  			  size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	unsigned long page;  	ssize_t length;  	struct task_struct *task = get_proc_task(inode); @@ -675,7 +669,7 @@ static const struct file_operations proc_single_file_operations = {  static int __mem_open(struct inode *inode, struct file *file, unsigned int mode)  { -	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	struct mm_struct *mm;  	if (!task) @@ -876,7 +870,7 @@ static const struct file_operations proc_environ_operations = {  static ssize_t oom_adj_read(struct file *file, char __user *buf, size_t count,  			    loff_t *ppos)  { -	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	char buffer[PROC_NUMBUF];  	int oom_adj = OOM_ADJUST_MIN;  	size_t len; @@ -923,7 +917,7 @@ static ssize_t oom_adj_write(struct file *file, const char __user *buf,  		goto out;  	} -	task = get_proc_task(file->f_path.dentry->d_inode); +	task = get_proc_task(file_inode(file));  	if (!task) {  		err = -ESRCH;  		goto out; @@ -959,7 +953,7 @@ static ssize_t oom_adj_write(struct file *file, const char __user *buf,  	 * /proc/pid/oom_adj is provided for legacy purposes, ask users to use  	 * /proc/pid/oom_score_adj instead.  	 */ -	printk_once(KERN_WARNING "%s (%d): /proc/%d/oom_adj is deprecated, please use /proc/%d/oom_score_adj instead.\n", +	pr_warn_once("%s (%d): /proc/%d/oom_adj is deprecated, please use /proc/%d/oom_score_adj instead.\n",  		  current->comm, task_pid_nr(current), task_pid_nr(task),  		  task_pid_nr(task)); @@ -983,7 +977,7 @@ static const struct file_operations proc_oom_adj_operations = {  static ssize_t oom_score_adj_read(struct file *file, char __user *buf,  					size_t count, loff_t *ppos)  { -	struct task_struct *task = get_proc_task(file->f_path.dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	char buffer[PROC_NUMBUF];  	short oom_score_adj = OOM_SCORE_ADJ_MIN;  	unsigned long flags; @@ -1026,7 +1020,7 @@ static ssize_t oom_score_adj_write(struct file *file, const char __user *buf,  		goto out;  	} -	task = get_proc_task(file->f_path.dentry->d_inode); +	task = get_proc_task(file_inode(file));  	if (!task) {  		err = -ESRCH;  		goto out; @@ -1074,7 +1068,7 @@ static const struct file_operations proc_oom_score_adj_operations = {  static ssize_t proc_loginuid_read(struct file * file, char __user * buf,  				  size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	struct task_struct *task = get_proc_task(inode);  	ssize_t length;  	char tmpbuf[TMPBUFLEN]; @@ -1091,7 +1085,7 @@ static ssize_t proc_loginuid_read(struct file * file, char __user * buf,  static ssize_t proc_loginuid_write(struct file * file, const char __user * buf,  				   size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	char *page, *tmp;  	ssize_t length;  	uid_t loginuid; @@ -1149,7 +1143,7 @@ static const struct file_operations proc_loginuid_operations = {  static ssize_t proc_sessionid_read(struct file * file, char __user * buf,  				  size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	struct task_struct *task = get_proc_task(inode);  	ssize_t length;  	char tmpbuf[TMPBUFLEN]; @@ -1172,7 +1166,7 @@ static const struct file_operations proc_sessionid_operations = {  static ssize_t proc_fault_inject_read(struct file * file, char __user * buf,  				      size_t count, loff_t *ppos)  { -	struct task_struct *task = get_proc_task(file->f_dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	char buffer[PROC_NUMBUF];  	size_t len;  	int make_it_fail; @@ -1204,7 +1198,7 @@ static ssize_t proc_fault_inject_write(struct file * file,  	make_it_fail = simple_strtol(strstrip(buffer), &end, 0);  	if (*end)  		return -EINVAL; -	task = get_proc_task(file->f_dentry->d_inode); +	task = get_proc_task(file_inode(file));  	if (!task)  		return -ESRCH;  	task->make_it_fail = make_it_fail; @@ -1244,7 +1238,7 @@ static ssize_t  sched_write(struct file *file, const char __user *buf,  	    size_t count, loff_t *offset)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct task_struct *p;  	p = get_proc_task(inode); @@ -1295,7 +1289,7 @@ static ssize_t  sched_autogroup_write(struct file *file, const char __user *buf,  	    size_t count, loff_t *offset)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct task_struct *p;  	char buffer[PROC_NUMBUF];  	int nice; @@ -1350,7 +1344,7 @@ static const struct file_operations proc_pid_sched_autogroup_operations = {  static ssize_t comm_write(struct file *file, const char __user *buf,  				size_t count, loff_t *offset)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct task_struct *p;  	char buffer[TASK_COMM_LEN]; @@ -1718,7 +1712,7 @@ static int map_files_d_revalidate(struct dentry *dentry, unsigned int flags)  		return -ECHILD;  	if (!capable(CAP_SYS_ADMIN)) { -		status = -EACCES; +		status = -EPERM;  		goto out_notask;  	} @@ -1851,7 +1845,7 @@ static struct dentry *proc_map_files_lookup(struct inode *dir,  	struct dentry *result;  	struct mm_struct *mm; -	result = ERR_PTR(-EACCES); +	result = ERR_PTR(-EPERM);  	if (!capable(CAP_SYS_ADMIN))  		goto out; @@ -1907,7 +1901,7 @@ proc_map_files_readdir(struct file *filp, void *dirent, filldir_t filldir)  	ino_t ino;  	int ret; -	ret = -EACCES; +	ret = -EPERM;  	if (!capable(CAP_SYS_ADMIN))  		goto out; @@ -2153,7 +2147,7 @@ out_no_task:  static ssize_t proc_pid_attr_read(struct file * file, char __user * buf,  				  size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	char *p = NULL;  	ssize_t length;  	struct task_struct *task = get_proc_task(inode); @@ -2174,7 +2168,7 @@ static ssize_t proc_pid_attr_read(struct file * file, char __user * buf,  static ssize_t proc_pid_attr_write(struct file * file, const char __user * buf,  				   size_t count, loff_t *ppos)  { -	struct inode * inode = file->f_path.dentry->d_inode; +	struct inode * inode = file_inode(file);  	char *page;  	ssize_t length;  	struct task_struct *task = get_proc_task(inode); @@ -2263,7 +2257,7 @@ static const struct inode_operations proc_attr_dir_inode_operations = {  static ssize_t proc_coredump_filter_read(struct file *file, char __user *buf,  					 size_t count, loff_t *ppos)  { -	struct task_struct *task = get_proc_task(file->f_dentry->d_inode); +	struct task_struct *task = get_proc_task(file_inode(file));  	struct mm_struct *mm;  	char buffer[PROC_NUMBUF];  	size_t len; @@ -2315,7 +2309,7 @@ static ssize_t proc_coredump_filter_write(struct file *file,  		goto out_no_task;  	ret = -ESRCH; -	task = get_proc_task(file->f_dentry->d_inode); +	task = get_proc_task(file_inode(file));  	if (!task)  		goto out_no_task; @@ -2625,6 +2619,7 @@ static void proc_flush_task_mnt(struct vfsmount *mnt, pid_t pid, pid_t tgid)  	name.name = buf;  	name.len = snprintf(buf, sizeof(buf), "%d", pid); +	/* no ->d_hash() rejects on procfs */  	dentry = d_hash_and_lookup(mnt->mnt_root, &name);  	if (dentry) {  		shrink_dcache_parent(dentry);  |