• Filipe Manana's avatar
    btrfs: remove useless logic when finding parent nodes · 56f5c199
    Filipe Manana authored
    At find_parent_nodes(), at its last step, when iterating over all direct
    references, we are checking if we have a share context and if we have
    a reference with a different root from the one in the share context.
    However that logic is pointless because of two reasons:
    
    1) After the previous patch in the series (subject "btrfs: remove roots
       ulist when checking data extent sharedness"), the roots argument is
       always NULL when using a share check context (struct share_check), so
       this code is never triggered;
    
    2) Even before that previous patch, we could not hit this code because
       if we had a reference with a root different from the one in our share
       context, then we would have exited earlier when doing either of the
       following:
    
          - Adding a second direct ref to the direct refs red black tree
            resulted in extent_is_shared() returning true when called from
            add_direct_ref() -> add_prelim_ref(), after processing delayed
            references or while processing references in the extent tree;
    
          - When adding a second reference to the indirect refs red black
            tree (same as above, extent_is_shared() returns true);
    
          - If we only have one indirect reference and no direct references,
            then when resolving it at resolve_indirect_refs() we immediately
            return that the target extent is shared, therefore never reaching
            that loop that iterates over all direct references at
            find_parent_nodes();
    
          - If we have 1 indirect reference and 1 direct reference, then we
            also exit early because extent_is_shared() ends up returning true
            when called through add_prelim_ref() (by add_direct_ref() or
            add_indirect_ref()) or add_delayed_refs(). Same applies as when
            having a combination of direct, indirect and indirect with missing
            key references.
    
       This logic had been obsoleted since commit 3ec4d323 ("btrfs:
       allow backref search checks for shared extents"), which introduced the
       early exits in case an extent is shared.
    
    So just remove that logic, and assert at find_parent_nodes() that when we
    have a share context we don't have a roots ulist and that we haven't found
    the extent to be directly shared after processing delayed references and
    all references from the extent tree.
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    56f5c199
backref.c 91.1 KB