Skip to content

Commit

Permalink
btrfs: fix check_shared for fiemap ioctl
Browse files Browse the repository at this point in the history
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: Tsutomu Itoh <t-itoh@jp.fujitsu.com>
Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
Lu Fengqi authored and kdave committed Sep 26, 2016
1 parent b0de6c4 commit afce772
Show file tree
Hide file tree
Showing 2 changed files with 369 additions and 10 deletions.
Loading

0 comments on commit afce772

Please sign in to comment.