• Jan Kara's avatar
    ext4: do not zeroout extents beyond i_disksize · 801674f3
    Jan Kara authored
    We do not want to create initialized extents beyond end of file because
    for e2fsck it is impossible to distinguish them from a case of corrupted
    file size / extent tree and so it complains like:
    
    Inode 12, i_size is 147456, should be 163840.  Fix? no
    
    Code in ext4_ext_convert_to_initialized() and
    ext4_split_convert_extents() try to make sure it does not create
    initialized extents beyond inode size however they check against
    inode->i_size which is wrong. They should instead check against
    EXT4_I(inode)->i_disksize which is the current inode size on disk.
    That's what e2fsck is going to see in case of crash before all dirty
    data is written. This bug manifests as generic/456 test failure (with
    recent enough fstests where fsx got fixed to properly pass
    FALLOC_KEEP_SIZE_FL flags to the kernel) when run with dioread_lock
    mount option.
    
    CC: stable@vger.kernel.org
    Fixes: 21ca087a ("ext4: Do not zero out uninitialized extents beyond i_size")
    Reviewed-by: default avatarLukas Czerner <lczerner@redhat.com>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Link: https://lore.kernel.org/r/20200331105016.8674-1-jack@suse.czSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    801674f3
extents.c 156 KB