• Qu Wenruo's avatar
    btrfs: update comments in btrfs_invalidatepage() · 266a2586
    Qu Wenruo authored
    The existing comments in btrfs_invalidatepage() don't really get to the
    point, especially for what Private2 is really representing and how the
    race avoidance is done.
    
    The truth is, there are only three entrances to do ordered extent
    accounting:
    
    - btrfs_writepage_endio_finish_ordered()
    - __endio_write_update_ordered()
      Those two entrance are just endio functions for dio and buffered
      write.
    
    - btrfs_invalidatepage()
    
    But there is a pitfall, in endio functions there is no check on whether
    the ordered extent is already accounted.
    They just blindly clear the Private2 bit and do the accounting.
    
    So it's all btrfs_invalidatepage()'s responsibility to make sure we
    won't do double account for the same sector.
    
    That's why in btrfs_invalidatepage() we have to wait for page writeback,
    this will ensure all submitted bios have finished, thus their endio
    functions have finished the accounting on the ordered extent.
    
    Then we also check page Private2 to ensure that, we only run ordered
    extent accounting on pages who has no bio submitted.
    
    This patch will rework related comments to make it more clear on the
    race and how we use wait_on_page_writeback() and Private2 to prevent
    double accounting on ordered extent.
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    266a2586
inode.c 297 KB