• Qu Wenruo's avatar
    btrfs: set correct ram_bytes when splitting ordered extent · 63a6ce5a
    Qu Wenruo authored
    [BUG]
    When running generic/287, the following file extent items can be
    generated:
    
            item 16 key (258 EXTENT_DATA 2682880) itemoff 15305 itemsize 53
                    generation 9 type 1 (regular)
                    extent data disk byte 1378414592 nr 462848
                    extent data offset 0 nr 462848 ram 2097152
                    extent compression 0 (none)
    
    Note that file extent item is not a compressed one, but its ram_bytes is
    way larger than its disk_num_bytes.
    
    According to btrfs on-disk scheme, ram_bytes should match disk_num_bytes
    if it's not a compressed one.
    
    [CAUSE]
    Since commit b73a6fd1 ("btrfs: split partial dio bios before
    submit"), for partial dio writes, we would split the ordered extent.
    
    However the function btrfs_split_ordered_extent() doesn't update the
    ram_bytes even it has already shrunk the disk_num_bytes.
    
    Originally the function btrfs_split_ordered_extent() is only introduced
    for zoned devices in commit d22002fd ("btrfs: zoned: split ordered
    extent when bio is sent"), but later commit b73a6fd1 ("btrfs: split
    partial dio bios before submit") makes non-zoned btrfs affected.
    
    Thankfully for un-compressed file extent, we do not really utilize the
    ram_bytes member, thus it won't cause any real problem.
    
    [FIX]
    Also update btrfs_ordered_extent::ram_bytes inside
    btrfs_split_ordered_extent().
    
    Fixes: d22002fd ("btrfs: zoned: split ordered extent when bio is sent")
    CC: stable@vger.kernel.org # 5.15+
    Reviewed-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    63a6ce5a
ordered-data.c 35.1 KB