Commit a8c450b2 authored by Chris Mason's avatar Chris Mason Committed by David Woodhouse

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: default avatarChris Mason <chris.mason@oracle.com>
parent 011410bd
......@@ -712,28 +712,6 @@ int set_extent_bit(struct extent_map_tree *tree, u64 start, u64 end, int bits,
}
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;
}
/*
* | ---- desired range ---- |
* | state | or | state |
......@@ -756,6 +734,28 @@ int set_extent_bit(struct extent_map_tree *tree, u64 start, u64 end, int bits,
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:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment