diff options
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 16 | 
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index acb7ef80ea4..a49d9dd06d1 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -561,9 +561,19 @@ static int proc_setattr(struct dentry *dentry, struct iattr *attr)  		return -EPERM;  	error = inode_change_ok(inode, attr); -	if (!error) -		error = inode_setattr(inode, attr); -	return error; +	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;  }  static const struct inode_operations proc_def_inode_operations = {  |