• ethanwu's avatar
    btrfs: backref, don't add refs from shared block when resolving normal backref · ed58f2e6
    ethanwu authored
    All references from the block of SHARED_DATA_REF belong to that shared
    block backref.
    
    For example:
    
      item 11 key (40831553536 EXTENT_ITEM 4194304) itemoff 15460 itemsize 95
          extent refs 24 gen 7302 flags DATA
          extent data backref root 257 objectid 260 offset 65536 count 5
          extent data backref root 258 objectid 265 offset 0 count 9
          shared data backref parent 394985472 count 10
    
    Block 394985472 might be leaf from root 257, and the item obejctid and
    (file_pos - file_extent_item::offset) in that leaf just happens to be
    260 and 65536 which is equal to the first extent data backref entry.
    
    Before this patch, when we resolve backref:
    
      root 257 objectid 260 offset 65536
    
    we will add those refs in block 394985472 and wrongly treat those as the
    refs we want.
    
    Fix this by checking if the leaf we are processing is shared data
    backref, if so, just skip this leaf.
    
    Shared data refs added into preftrees.direct have all entry value = 0
    (root_id = 0, key = NULL, level = 0) except parent entry.
    
    Other refs from indirect tree will have key value and root id != 0, and
    these values won't be changed when their parent is resolved and added to
    preftrees.direct. Therefore, we could reuse the preftrees.direct and
    search ref with all values = 0 except parent is set to avoid getting
    those resolved refs block.
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Signed-off-by: default avatarethanwu <ethanwu@synology.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    ed58f2e6
backref.c 60.5 KB