btrfs: pass the new logical address to split_extent_map
authorChristoph Hellwig <hch@lst.de>
Wed, 24 May 2023 15:03:17 +0000 (17:03 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 19 Jun 2023 11:59:33 +0000 (13:59 +0200)
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>
fs/btrfs/extent_map.c
fs/btrfs/extent_map.h
fs/btrfs/inode.c
fs/btrfs/zoned.c

index e512446..0cdb3e8 100644 (file)
@@ -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.
  */
-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 *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->len = pre;
        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->orig_block_len = split_pre->block_len;
        split_pre->ram_bytes = split_pre->len;
index 7df3911..35d27c7 100644 (file)
@@ -90,7 +90,8 @@ struct extent_map *lookup_extent_mapping(struct extent_map_tree *tree,
 int add_extent_mapping(struct extent_map_tree *tree,
                       struct extent_map *em, int modified);
 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);
 void free_extent_map(struct extent_map *em);
index ff3110a..b8c6488 100644 (file)
@@ -2736,7 +2736,8 @@ static int btrfs_extract_ordered_extent(struct btrfs_bio *bbio,
         */
        if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags)) {
                ret = split_extent_map(bbio->inode, bbio->file_offset,
-                                      ordered->num_bytes, len);
+                                      ordered->num_bytes, len,
+                                      ordered->disk_bytenr);
                if (ret)
                        return ret;
        }
index b4dd018..f1471cb 100644 (file)
@@ -1689,15 +1689,13 @@ static bool btrfs_zoned_split_ordered(struct btrfs_ordered_extent *ordered,
 
        if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered->flags) &&
            split_extent_map(BTRFS_I(ordered->inode), ordered->file_offset,
-                            ordered->num_bytes, len))
+                            ordered->num_bytes, len, logical))
                return false;
 
        new = btrfs_split_ordered_extent(ordered, len);
        if (IS_ERR(new))
                return false;
-
-       if (new->disk_bytenr != logical)
-               btrfs_rewrite_logical_zoned(new, logical);
+       new->disk_bytenr = logical;
        btrfs_finish_one_ordered(new);
        return true;
 }