btrfs: pass the new logical address to split_extent_map
split_extent_map splits off the first chunk of an extent map into a new one. One of the two users is the zoned I/O completion code that wants to rewrite the logical block start address right after this split. Pass in the logical address to be set in the split off first extent_map as an argument to avoid an extra extent tree lookup for this case. Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
71df088c1c
commit
f000bc6fe4
|
@ -963,11 +963,13 @@ int btrfs_replace_extent_map_range(struct btrfs_inode *inode,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Split off the first pre bytes from the extent_map at [start, start + len]
|
* Split off the first pre bytes from the extent_map at [start, start + len],
|
||||||
|
* and set the block_start for it to new_logical.
|
||||||
*
|
*
|
||||||
* This function is used when an ordered_extent needs to be split.
|
* This function is used when an ordered_extent needs to be split.
|
||||||
*/
|
*/
|
||||||
int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre)
|
int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
|
||||||
|
u64 new_logical)
|
||||||
{
|
{
|
||||||
struct extent_map_tree *em_tree = &inode->extent_tree;
|
struct extent_map_tree *em_tree = &inode->extent_tree;
|
||||||
struct extent_map *em;
|
struct extent_map *em;
|
||||||
|
@ -1010,7 +1012,7 @@ int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre)
|
||||||
split_pre->start = em->start;
|
split_pre->start = em->start;
|
||||||
split_pre->len = pre;
|
split_pre->len = pre;
|
||||||
split_pre->orig_start = split_pre->start;
|
split_pre->orig_start = split_pre->start;
|
||||||
split_pre->block_start = em->block_start;
|
split_pre->block_start = new_logical;
|
||||||
split_pre->block_len = split_pre->len;
|
split_pre->block_len = split_pre->len;
|
||||||
split_pre->orig_block_len = split_pre->block_len;
|
split_pre->orig_block_len = split_pre->block_len;
|
||||||
split_pre->ram_bytes = split_pre->len;
|
split_pre->ram_bytes = split_pre->len;
|
||||||
|
|
|
@ -90,7 +90,8 @@ struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
|
||||||
int add_extent_mapping(struct extent_map_tree *tree,
|
int add_extent_mapping(struct extent_map_tree *tree,
|
||||||
struct extent_map *em, int modified);
|
struct extent_map *em, int modified);
|
||||||
void remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
|
void remove_extent_mapping(struct extent_map_tree *tree, struct extent_map *em);
|
||||||
int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre);
|
int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
|
||||||
|
u64 new_logical);
|
||||||
|
|
||||||
struct extent_map *alloc_extent_map(void);
|
struct extent_map *alloc_extent_map(void);
|
||||||
void free_extent_map(struct extent_map *em);
|
void free_extent_map(struct extent_map *em);
|
||||||
|
|
|
@ -2736,7 +2736,8 @@ static int btrfs_extract_ordered_extent(struct btrfs_bio *bbio,
|
||||||
*/
|
*/
|
||||||
if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags)) {
|
if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags)) {
|
||||||
ret = split_extent_map(bbio->inode, bbio->file_offset,
|
ret = split_extent_map(bbio->inode, bbio->file_offset,
|
||||||
ordered->num_bytes, len);
|
ordered->num_bytes, len,
|
||||||
|
ordered->disk_bytenr);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1689,15 +1689,13 @@ static bool btrfs_zoned_split_ordered(struct btrfs_ordered_extent *ordered,
|
||||||
|
|
||||||
if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags) &&
|
if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags) &&
|
||||||
split_extent_map(BTRFS_I(ordered->inode), ordered->file_offset,
|
split_extent_map(BTRFS_I(ordered->inode), ordered->file_offset,
|
||||||
ordered->num_bytes, len))
|
ordered->num_bytes, len, logical))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
new = btrfs_split_ordered_extent(ordered, len);
|
new = btrfs_split_ordered_extent(ordered, len);
|
||||||
if (IS_ERR(new))
|
if (IS_ERR(new))
|
||||||
return false;
|
return false;
|
||||||
|
new->disk_bytenr = logical;
|
||||||
if (new->disk_bytenr != logical)
|
|
||||||
btrfs_rewrite_logical_zoned(new, logical);
|
|
||||||
btrfs_finish_one_ordered(new);
|
btrfs_finish_one_ordered(new);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue