diff options
-rw-r--r-- | fs/f2fs/file.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index a041c66fd611..a95ba23e3bd3 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -560,15 +560,22 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) | |||
560 | if (err) | 560 | if (err) |
561 | return err; | 561 | return err; |
562 | 562 | ||
563 | if ((attr->ia_valid & ATTR_SIZE) && | 563 | if (attr->ia_valid & ATTR_SIZE) { |
564 | attr->ia_size != i_size_read(inode)) { | ||
565 | err = f2fs_convert_inline_data(inode, attr->ia_size, NULL); | 564 | err = f2fs_convert_inline_data(inode, attr->ia_size, NULL); |
566 | if (err) | 565 | if (err) |
567 | return err; | 566 | return err; |
568 | 567 | ||
569 | truncate_setsize(inode, attr->ia_size); | 568 | if (attr->ia_size != i_size_read(inode)) { |
570 | f2fs_truncate(inode); | 569 | truncate_setsize(inode, attr->ia_size); |
571 | f2fs_balance_fs(F2FS_I_SB(inode)); | 570 | f2fs_truncate(inode); |
571 | f2fs_balance_fs(F2FS_I_SB(inode)); | ||
572 | } else { | ||
573 | /* | ||
574 | * giving a chance to truncate blocks past EOF which | ||
575 | * are fallocated with FALLOC_FL_KEEP_SIZE. | ||
576 | */ | ||
577 | f2fs_truncate(inode); | ||
578 | } | ||
572 | } | 579 | } |
573 | 580 | ||
574 | __setattr_copy(inode, attr); | 581 | __setattr_copy(inode, attr); |