Btrfs: make find_first_extent_bit be able to cache any state
Right now the only caller of find_first_extent_bit() that is interested in caching extent states (transaction or log commit), never gets an extent state cached. This is because find_first_extent_bit() only caches states that have at least one of the flags EXTENT_IOBITS or EXTENT_BOUNDARY, and the transaction/log commit caller always passes a tree that doesn't have ever extent states with any of those flags (they can only have one of the following flags: EXTENT_DIRTY, EXTENT_NEW or EXTENT_NEED_WAIT). This change together with the following one in the patch series (titled "Btrfs: avoid returning -ENOMEM in convert_extent_bit() too early") will help reduce significantly the chances of calls to convert_extent_bit() fail with -ENOMEM when called from the transaction/log commit code. Signed-off-by: Filipe Manana <fdmanana@suse.com> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:

committed by
Chris Mason

parent
663dfbb077
commit
e38e2ed701
@@ -883,6 +883,7 @@ int btrfs_write_marked_extents(struct btrfs_root *root,
|
||||
werr = err;
|
||||
else if (wait_writeback)
|
||||
werr = filemap_fdatawait_range(mapping, start, end);
|
||||
free_extent_state(cached_state);
|
||||
cached_state = NULL;
|
||||
cond_resched();
|
||||
start = end + 1;
|
||||
@@ -927,6 +928,8 @@ int btrfs_wait_marked_extents(struct btrfs_root *root,
|
||||
err = filemap_fdatawait_range(mapping, start, end);
|
||||
if (err)
|
||||
werr = err;
|
||||
free_extent_state(cached_state);
|
||||
cached_state = NULL;
|
||||
cond_resched();
|
||||
start = end + 1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user