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 acb7ef80ea4f..a49d9dd06d1d 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) | |||
561 | return -EPERM; | 561 | return -EPERM; |
562 | 562 | ||
563 | error = inode_change_ok(inode, attr); | 563 | error = inode_change_ok(inode, attr); |
564 | if (!error) | 564 | if (error) |
565 | error = inode_setattr(inode, attr); | 565 | return error; |
566 | return error; | 566 | |
567 | if ((attr->ia_valid & ATTR_SIZE) && | ||
568 | attr->ia_size != i_size_read(inode)) { | ||
569 | error = vmtruncate(inode, attr->ia_size); | ||
570 | if (error) | ||
571 | return error; | ||
572 | } | ||
573 | |||
574 | setattr_copy(inode, attr); | ||
575 | mark_inode_dirty(inode); | ||
576 | return 0; | ||
567 | } | 577 | } |
568 | 578 | ||
569 | static const struct inode_operations proc_def_inode_operations = { | 579 | static const struct inode_operations proc_def_inode_operations = { |