summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent_map.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2007-09-10 20:00:27 -0400
committerDavid Woodhouse <dwmw2@hera.kernel.org>2007-09-10 20:00:27 -0400
commita8c450b211c010ac55190da23ceb6b39b393f411 (patch)
tree0582abbf328a9635fd49b8165e102715e8f9c470 /fs/btrfs/extent_map.c
parent011410bd859a481a335d7db1fb559542c5663fd5 (diff)
downloadlinux-stable-a8c450b211c010ac55190da23ceb6b39b393f411.tar.gz
linux-stable-a8c450b211c010ac55190da23ceb6b39b393f411.tar.bz2
linux-stable-a8c450b211c010ac55190da23ceb6b39b393f411.zip
Btrfs: Reorder tests in set_extent_bit to properly find holes
Yan Zheng noticed that set_extent_bit was exiting too early when there was a hole in the map. The fix is to reorder the tests to check for the hole first. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent_map.c')
-rw-r--r--fs/btrfs/extent_map.c44
1 files changed, 22 insertions, 22 deletions
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
index 33f7a18dddf7..370ed97e52f5 100644
--- a/fs/btrfs/extent_map.c
+++ b/fs/btrfs/extent_map.c
@@ -714,28 +714,6 @@ again:
}
/*
* | ---- desired range ---- |
- * | state |
- * We need to split the extent, and set the bit
- * on the first half
- */
- if (state->start <= end && state->end > end) {
- set = state->state & bits;
- if (exclusive && set) {
- *failed_start = start;
- err = -EEXIST;
- goto out;
- }
- err = split_state(tree, state, prealloc, end + 1);
- BUG_ON(err == -EEXIST);
-
- prealloc->state |= bits;
- merge_state(tree, prealloc);
- prealloc = NULL;
- goto out;
- }
-
- /*
- * | ---- desired range ---- |
* | state | or | state |
*
* There's a hole, we need to insert something in it and
@@ -756,6 +734,28 @@ again:
start = this_end + 1;
goto search_again;
}
+ /*
+ * | ---- desired range ---- |
+ * | state |
+ * We need to split the extent, and set the bit
+ * on the first half
+ */
+ if (state->start <= end && state->end > end) {
+ set = state->state & bits;
+ if (exclusive && set) {
+ *failed_start = start;
+ err = -EEXIST;
+ goto out;
+ }
+ err = split_state(tree, state, prealloc, end + 1);
+ BUG_ON(err == -EEXIST);
+
+ prealloc->state |= bits;
+ merge_state(tree, prealloc);
+ prealloc = NULL;
+ goto out;
+ }
+
goto search_again;
out: