diff options
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 19 | 
1 files changed, 13 insertions, 6 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index c2964d890c9a..8e654468ab67 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -252,7 +252,7 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf,  	 * Inherently racy -- command line shares address space  	 * with code and data.  	 */ -	rv = access_remote_vm(mm, arg_end - 1, &c, 1, 0); +	rv = access_remote_vm(mm, arg_end - 1, &c, 1, FOLL_FORCE);  	if (rv <= 0)  		goto out_free_page; @@ -270,7 +270,8 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf,  			int nr_read;  			_count = min3(count, len, PAGE_SIZE); -			nr_read = access_remote_vm(mm, p, page, _count, 0); +			nr_read = access_remote_vm(mm, p, page, _count, +					FOLL_FORCE);  			if (nr_read < 0)  				rv = nr_read;  			if (nr_read <= 0) @@ -305,7 +306,8 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf,  			bool final;  			_count = min3(count, len, PAGE_SIZE); -			nr_read = access_remote_vm(mm, p, page, _count, 0); +			nr_read = access_remote_vm(mm, p, page, _count, +					FOLL_FORCE);  			if (nr_read < 0)  				rv = nr_read;  			if (nr_read <= 0) @@ -354,7 +356,8 @@ skip_argv:  			bool final;  			_count = min3(count, len, PAGE_SIZE); -			nr_read = access_remote_vm(mm, p, page, _count, 0); +			nr_read = access_remote_vm(mm, p, page, _count, +					FOLL_FORCE);  			if (nr_read < 0)  				rv = nr_read;  			if (nr_read <= 0) @@ -832,6 +835,7 @@ static ssize_t mem_rw(struct file *file, char __user *buf,  	unsigned long addr = *ppos;  	ssize_t copied;  	char *page; +	unsigned int flags = FOLL_FORCE;  	if (!mm)  		return 0; @@ -844,6 +848,9 @@ static ssize_t mem_rw(struct file *file, char __user *buf,  	if (!atomic_inc_not_zero(&mm->mm_users))  		goto free; +	if (write) +		flags |= FOLL_WRITE; +  	while (count > 0) {  		int this_len = min_t(int, count, PAGE_SIZE); @@ -852,7 +859,7 @@ static ssize_t mem_rw(struct file *file, char __user *buf,  			break;  		} -		this_len = access_remote_vm(mm, addr, page, this_len, write); +		this_len = access_remote_vm(mm, addr, page, this_len, flags);  		if (!this_len) {  			if (!copied)  				copied = -EIO; @@ -965,7 +972,7 @@ static ssize_t environ_read(struct file *file, char __user *buf,  		this_len = min(max_len, this_len);  		retval = access_remote_vm(mm, (env_start + src), -			page, this_len, 0); +			page, this_len, FOLL_FORCE);  		if (retval <= 0) {  			ret = retval;  | 
