aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nilfs2/inode.c')
-rw-r--r--fs/nilfs2/inode.c25
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
678out_err:
679 nilfs_transaction_abort(sb);
667 return err; 680 return err;
668} 681}
669 682