btrfs: don't clear CTL bits when trying to release extent state
When trying to release the extent states due to memory pressure we'll set all the bits except LOCKED, NODATASUM, and DELALLOC_NEW. This includes some of the CTL bits, which isn't really a problem but isn't correct either. Exclude the CTL bits from this clearing. Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
71528e9e16
commit
b71fb16b2f
|
@ -3388,15 +3388,17 @@ static int try_release_extent_state(struct extent_io_tree *tree,
|
||||||
if (test_range_bit(tree, start, end, EXTENT_LOCKED, 0, NULL)) {
|
if (test_range_bit(tree, start, end, EXTENT_LOCKED, 0, NULL)) {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
} else {
|
} else {
|
||||||
|
u32 clear_bits = ~(EXTENT_LOCKED | EXTENT_NODATASUM |
|
||||||
|
EXTENT_DELALLOC_NEW | EXTENT_CTLBITS);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* At this point we can safely clear everything except the
|
* At this point we can safely clear everything except the
|
||||||
* locked bit, the nodatasum bit and the delalloc new bit.
|
* locked bit, the nodatasum bit and the delalloc new bit.
|
||||||
* The delalloc new bit will be cleared by ordered extent
|
* The delalloc new bit will be cleared by ordered extent
|
||||||
* completion.
|
* completion.
|
||||||
*/
|
*/
|
||||||
ret = __clear_extent_bit(tree, start, end,
|
ret = __clear_extent_bit(tree, start, end, clear_bits, 0, NULL,
|
||||||
~(EXTENT_LOCKED | EXTENT_NODATASUM | EXTENT_DELALLOC_NEW),
|
mask, NULL);
|
||||||
0, NULL, mask, NULL);
|
|
||||||
|
|
||||||
/* if clear_extent_bit failed for enomem reasons,
|
/* if clear_extent_bit failed for enomem reasons,
|
||||||
* we can't allow the release to continue.
|
* we can't allow the release to continue.
|
||||||
|
|
Loading…
Reference in New Issue