• Lu Fengqi's avatar
    btrfs: fix check_shared for fiemap ioctl · afce772e
    Lu Fengqi authored
    Only in the case of different root_id or different object_id, check_shared
    identified extent as the shared. However, If a extent was referred by
    different offset of same file, it should also be identified as shared.
    In addition, check_shared's loop scale is at least n^3, so if a extent
    has too many references, even causes soft hang up.
    
    First, add all delayed_ref to the ref_tree and calculate the unqiue_refs,
    if the unique_refs is greater than one, return BACKREF_FOUND_SHARED.
    Then individually add the on-disk reference(inline/keyed) to the ref_tree
    and calculate the unique_refs of the ref_tree to check if the unique_refs
    is greater than one.Because once there are two references to return
    SHARED, so the time complexity is close to the constant.
    Reported-by: default avatarTsutomu Itoh <t-itoh@jp.fujitsu.com>
    Signed-off-by: default avatarLu Fengqi <lufq.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    afce772e
backref.c 60 KB