ext4: fast commit may miss tracking unwritten range during ftruncate
authorXin Yin <yinxin.x@bytedance.com>
Thu, 23 Dec 2021 03:23:37 +0000 (11:23 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 10 Jan 2022 18:25:54 +0000 (13:25 -0500)
If use FALLOC_FL_KEEP_SIZE to alloc unwritten range at bottom, the
inode->i_size will not include the unwritten range. When call
ftruncate with fast commit enabled, it will miss to track the
unwritten range.

Change to trace the full range during ftruncate.

Signed-off-by: Xin Yin <yinxin.x@bytedance.com>
Reviewed-by: Harshad Shirwadkar <harshadshirwadkar@gmail.com>
Link: https://lore.kernel.org/r/20211223032337.5198-3-yinxin.x@bytedance.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@kernel.org
fs/ext4/inode.c

index 4895909de21bf5b96a8c4867aa8b889a132cc2ea..08a90e25b78bcd546a3f99c71443fdcdef621d24 100644 (file)
@@ -5424,8 +5424,7 @@ int ext4_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
                                ext4_fc_track_range(handle, inode,
                                        (attr->ia_size > 0 ? attr->ia_size - 1 : 0) >>
                                        inode->i_sb->s_blocksize_bits,
-                                       (oldsize > 0 ? oldsize - 1 : 0) >>
-                                       inode->i_sb->s_blocksize_bits);
+                                       EXT_MAX_BLOCKS - 1);
                        else
                                ext4_fc_track_range(
                                        handle, inode,