Quoted from commit 3da40c7b0898 ("ext4: only call ext4_truncate when size <= isize") " At LSF we decided that if we truncate up from isize we shouldn't trim fallocated blocks that were fallocated with KEEP_SIZE and are past the new i_size. This patch fixes ext4 to do this. " And generic/092 of fstest have covered this case for long time, however is_quota_modification() didn't adjust based on that rule, so that in below condition, we will lose to quota block change: - fallocate blocks beyond EOF - remount - truncate(file_path, file_size) Fix it.
Unified · Split
| @@ -22,7 +22,7 @@ static inline struct quota_info *sb_dqopt(struct super_block *sb) · 21 unmodified lines | ||
| 22 | 22 | /* i_mutex must being held */ |
| 23 | 23 | static inline bool is_quota_modification(struct inode *inode, struct iattr *ia) |
| 24 | 24 | { |
| 25 | − return (ia->ia_valid & ATTR_SIZE && ia->ia_size != inode->i_size) || | |
| 25 | + return (ia->ia_valid & ATTR_SIZE) || | |
| 26 | 26 | (ia->ia_valid & ATTR_UID && !uid_eq(ia->ia_uid, inode->i_uid)) || |
| 27 | 27 | (ia->ia_valid & ATTR_GID && !gid_eq(ia->ia_gid, inode->i_gid)); |
| 28 | 28 | } |