mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-16 15:34:48 +08:00
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>
This commit is contained in:
parent
011410bd85
commit
a8c450b211
@ -712,28 +712,6 @@ again:
|
|||||||
}
|
}
|
||||||
goto search_again;
|
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 ---- |
|
* | ---- desired range ---- |
|
||||||
* | state | or | state |
|
* | state | or | state |
|
||||||
@ -756,6 +734,28 @@ again:
|
|||||||
start = this_end + 1;
|
start = this_end + 1;
|
||||||
goto search_again;
|
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;
|
goto search_again;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
Loading…
Reference in New Issue
Block a user