提交 c3308f84 编写于 作者: J Josef Bacik 提交者: Chris Mason

Btrfs: fix punch hole when no extent exists

I saw the warning in btrfs_drop_extent_cache where our end is less than our
start while running xfstests 68 in a loop.  This is because we
unconditionally do drop_end = min(end, extent_end) in
__btrfs_drop_extents(), even though we may not have found an extent in the
range we were looking to drop.  So keep track of wether or not we found
something, and if we didn't just use our end.  Thanks,
Signed-off-by: NJosef Bacik <jbacik@fusionio.com>
上级 926ced12
...@@ -609,6 +609,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans, ...@@ -609,6 +609,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans,
int ret; int ret;
int modify_tree = -1; int modify_tree = -1;
int update_refs = (root->ref_cows || root == root->fs_info->tree_root); int update_refs = (root->ref_cows || root == root->fs_info->tree_root);
int found = 0;
if (drop_cache) if (drop_cache)
btrfs_drop_extent_cache(inode, start, end - 1, 0); btrfs_drop_extent_cache(inode, start, end - 1, 0);
...@@ -674,6 +675,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans, ...@@ -674,6 +675,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans,
goto next_slot; goto next_slot;
} }
found = 1;
search_start = max(key.offset, start); search_start = max(key.offset, start);
if (recow || !modify_tree) { if (recow || !modify_tree) {
modify_tree = -1; modify_tree = -1;
...@@ -829,7 +831,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans, ...@@ -829,7 +831,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans,
} }
if (drop_end) if (drop_end)
*drop_end = min(end, extent_end); *drop_end = found ? min(end, extent_end) : end;
btrfs_release_path(path); btrfs_release_path(path);
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册