aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/file.c
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2012-09-14 14:51:22 -0400
committerChris Mason <chris.mason@fusionio.com>2012-10-04 09:40:00 -0400
commitc3308f84c1743eabb91f4976a314d118d5ea2342 (patch)
tree996b83b71224a03621fae61a32e8f194954deebf /fs/btrfs/file.c
parent926ced123bd6651b30a07f65a2a8a0b26154cd58 (diff)
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: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r--fs/btrfs/file.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index d0fc4c5aaf15..110d3cb7b6fe 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -609,6 +609,7 @@ int __btrfs_drop_extents(struct btrfs_trans_handle *trans,
609 int ret; 609 int ret;
610 int modify_tree = -1; 610 int modify_tree = -1;
611 int update_refs = (root->ref_cows || root == root->fs_info->tree_root); 611 int update_refs = (root->ref_cows || root == root->fs_info->tree_root);
612 int found = 0;
612 613
613 if (drop_cache) 614 if (drop_cache)
614 btrfs_drop_extent_cache(inode, start, end - 1, 0); 615 btrfs_drop_extent_cache(inode, start, end - 1, 0);
@@ -674,6 +675,7 @@ next_slot:
674 goto next_slot; 675 goto next_slot;
675 } 676 }
676 677
678 found = 1;
677 search_start = max(key.offset, start); 679 search_start = max(key.offset, start);
678 if (recow || !modify_tree) { 680 if (recow || !modify_tree) {
679 modify_tree = -1; 681 modify_tree = -1;
@@ -829,7 +831,7 @@ next_slot:
829 } 831 }
830 832
831 if (drop_end) 833 if (drop_end)
832 *drop_end = min(end, extent_end); 834 *drop_end = found ? min(end, extent_end) : end;
833 btrfs_release_path(path); 835 btrfs_release_path(path);
834 return ret; 836 return ret;
835} 837}