• Liu Bo's avatar
    Btrfs: fix another race between truncate and lockless dio write · 4aaedfb0
    Liu Bo authored
    Dio writes can update i_size in btrfs_get_blocks_direct when it
    writes to offset beyond EOF so that endio can update disk_i_size
    correctly (because we don't udpate disk_i_size beyond i_size).
    
    However, when truncating down a file, we firstly update i_size
    and then wait for in-flight lockless dio reads/writes, according
    to the above, i_size may have been changed in dio writes, and
    file extents don't get truncated.
    
    For lockless dio writes are always overwrites, i_size is not
    supposed to be changed, so this adds a check to filter out this
    case.
    
    The race could be reproduced by fstests/generic/299 with patch
    "Btrfs: fix btrfs_ordered_update_i_size to update disk_i_size properly"
     applied.
    Signed-off-by: default avatarLiu Bo <bo.li.liu@oracle.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    4aaedfb0
inode.c 284 KB