• J
    Btrfs: fix file extent corruption · 62fe51c1
    Josef Bacik 提交于
    In order to do hole punching we have a block reserve to hold the reservation we
    need to drop the extents in our range.  Since we could end up dropping a lot of
    extents we set rsv->failfast so we can just loop around again and drop the
    remaining of the range.  Unfortunately we unconditionally fill the hole extents
    in and start from the last extent we encountered, which we may or may not have
    dropped.  So this can result in overlapping file extent entries, which can be
    tripped over in a variety of ways, either by hitting BUG_ON(!ret) in
    fill_holes() after the search, or in btrfs_set_item_key_safe() in
    btrfs_drop_extent() at a later time by an unrelated task.  Fix this by only
    setting drop_end to the last extent we did actually drop.  This way our holes
    are filled in properly for the range that we did drop, and the rest of the range
    that remains to be dropped is actually dropped.  Thanks,
    Signed-off-by: NJosef Bacik <jbacik@fb.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    62fe51c1
file.c 81.1 KB