diff options
author | Chris Mason <chris.mason@oracle.com> | 2007-09-10 20:00:27 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@hera.kernel.org> | 2007-09-10 20:00:27 -0400 |
commit | a8c450b211c010ac55190da23ceb6b39b393f411 (patch) | |
tree | 0582abbf328a9635fd49b8165e102715e8f9c470 /fs/btrfs/extent_map.c | |
parent | 011410bd859a481a335d7db1fb559542c5663fd5 (diff) | |
download | linux-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.c | 44 |
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: |