diff options
Diffstat (limited to 'fs/nilfs2/inode.c')
-rw-r--r-- | fs/nilfs2/inode.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/fs/nilfs2/inode.c b/fs/nilfs2/inode.c index 5c694ece172..051d279abb3 100644 --- a/fs/nilfs2/inode.c +++ b/fs/nilfs2/inode.c | |||
@@ -656,14 +656,27 @@ int nilfs_setattr(struct dentry *dentry, struct iattr *iattr) | |||
656 | err = nilfs_transaction_begin(sb, &ti, 0); | 656 | err = nilfs_transaction_begin(sb, &ti, 0); |
657 | if (unlikely(err)) | 657 | if (unlikely(err)) |
658 | return err; | 658 | return err; |
659 | err = inode_setattr(inode, iattr); | 659 | |
660 | if (!err && (iattr->ia_valid & ATTR_MODE)) | 660 | if ((iattr->ia_valid & ATTR_SIZE) && |
661 | iattr->ia_size != i_size_read(inode)) { | ||
662 | err = vmtruncate(inode, iattr->ia_size); | ||
663 | if (unlikely(err)) | ||
664 | goto out_err; | ||
665 | } | ||
666 | |||
667 | setattr_copy(inode, iattr); | ||
668 | mark_inode_dirty(inode); | ||
669 | |||
670 | if (iattr->ia_valid & ATTR_MODE) { | ||
661 | err = nilfs_acl_chmod(inode); | 671 | err = nilfs_acl_chmod(inode); |
662 | if (likely(!err)) | 672 | if (unlikely(err)) |
663 | err = nilfs_transaction_commit(sb); | 673 | goto out_err; |
664 | else | 674 | } |
665 | nilfs_transaction_abort(sb); | 675 | |
676 | return nilfs_transaction_commit(sb); | ||
666 | 677 | ||
678 | out_err: | ||
679 | nilfs_transaction_abort(sb); | ||
667 | return err; | 680 | return err; |
668 | } | 681 | } |
669 | 682 | ||