• Q
    btrfs: qgroup: Fix qgroup data leaking by using subtree tracing · 824d8dff
    Qu Wenruo 提交于
    Commit 62b99540 (btrfs: relocation: Fix leaking qgroups numbers
    on data extents) only fixes the problem partly.
    
    The previous fix is to trace all new data extents at transaction commit
    time when balance finishes.
    
    However balance is not done in a large transaction, every path
    replacement can happen in its own transaction.
    This makes the fix useless if transaction commits during relocation.
    
    For example:
    relocate_block_group()
    |-merge_reloc_roots()
    |  |- merge_reloc_root()
    |     |- btrfs_start_transaction()         <- Trans X
    |     |- replace_path()                    <- Cause leak
    |     |- btrfs_end_transaction_throttle()  <- Trans X commits here
    |     |                                       Leak not fixed
    |     |
    |     |- btrfs_start_transaction()         <- Trans Y
    |     |- replace_path()                    <- Cause leak
    |     |- btrfs_end_transaction_throttle()  <- Trans Y ends
    |                                             but not committed
    |-btrfs_join_transaction()                 <- Still trans Y
    |-qgroup_fix()                             <- Only fixes data leak
    |                                             in trans Y
    |-btrfs_commit_transaction()               <- Trans Y commits
    
    In that case, qgroup fixup can only fix data leak in trans Y, data leak
    in trans X is out of fix.
    
    So the correct fix should happen in the same transaction of
    replace_path().
    
    This patch fixes it by tracing both subtrees of tree block swap, so it
    can fix the problem and ensure all leaking and fix are in the same
    transaction, so no leak again.
    Reported-by: NGoldwyn Rodrigues <rgoldwyn@suse.com>
    Signed-off-by: NQu Wenruo <quwenruo@cn.fujitsu.com>
    Reviewed-and-Tested-by: NGoldwyn Rodrigues <rgoldwyn@suse.com>
    Signed-off-by: NDavid Sterba <dsterba@suse.com>
    824d8dff
relocation.c 112.6 KB