• C
    Btrfs: fix extent pinning bugs in the tree log · e688b725
    Chris Mason 提交于
    The tree log had two important bugs that could cause corruptions after a
    crash.  Sometimes we were allowing tree log blocks to be reused after
    the tree log was committed but before the transaction commit was done.
    
    This allowed a future metadata write to overwrite the tree log data.  It
    is fixed by adding a new variant of freeing reserved extents that always
    pins them.  Credit goes to Stefan Behrens and Arne Jansen for many many
    hours spent tracking this bug down.
    
    During tree log replay, we do a pass through the tree log and pin all
    the extents we find.  This makes sure the replay code won't go in and
    use any of those blocks for new allocations during replay.  The problem
    is the free space cache isn't honoring these pinned extents.  So the
    allocator can end up handing them out, leading to all kinds of problems
    during replay.
    
    The fix here is to force any free space cache to load while we pin the
    extents, and then to make sure we remove the pinned extents from the
    free space rbtree.
    Signed-off-by: NChris Mason <chris.mason@oracle.com>
    Reported-by: NStefan Behrens <sbehrens@giantdisaster.de>
    e688b725
extent-tree.c 198.8 KB