diff mbox series

[v2,07/11] btrfs: remove extent_map::block_start member

Message ID 9333b82dcbe22bd78687f702485d308daaedc7a9.1714707707.git.wqu@suse.com (mailing list archive)
State New
Headers show
Series btrfs: extent-map: unify the members with btrfs_ordered_extent | expand

Commit Message

Qu Wenruo May 3, 2024, 6:01 a.m. UTC
The member extent_map::block_start can be calculated from
extent_map::disk_bytenr + extent_map::offset for regular extents.
And otherwise just extent_map::disk_bytenr.

And this is already validated by the validate_extent_map().
Now we can remove the member.

However there is a special case in btrfs_alloc_ordered_extent(), where
we intentionally pass a pseudo ordered extent, exploiting the fact that
for NOCOW/PREALLOC writes we do not rely on ordered extent members to
update the file extent items.

And that's the only way to pass btrfs_extract_ordered_extent(), as it
doesn't accept any ordered extent with an offset.

For now we will keep the old pseudo ordered extent members, and leave
the cleanup of it for the future.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
---
 fs/btrfs/compression.c            |  3 +-
 fs/btrfs/defrag.c                 |  9 ++-
 fs/btrfs/extent_io.c              | 10 ++--
 fs/btrfs/extent_map.c             | 56 +++++------------
 fs/btrfs/extent_map.h             | 22 ++++---
 fs/btrfs/file-item.c              |  4 --
 fs/btrfs/file.c                   | 11 ++--
 fs/btrfs/inode.c                  | 84 +++++++++++++++-----------
 fs/btrfs/relocation.c             |  1 -
 fs/btrfs/tests/extent-map-tests.c | 48 ++++++---------
 fs/btrfs/tests/inode-tests.c      | 99 ++++++++++++++++---------------
 fs/btrfs/tree-log.c               | 17 +++---
 fs/btrfs/zoned.c                  |  4 +-
 include/trace/events/btrfs.h      | 11 +---
 14 files changed, 172 insertions(+), 207 deletions(-)

Comments

Filipe Manana May 16, 2024, 5:28 p.m. UTC | #1
On Fri, May 3, 2024 at 7:02 AM Qu Wenruo <wqu@suse.com> wrote:
>
> The member extent_map::block_start can be calculated from
> extent_map::disk_bytenr + extent_map::offset for regular extents.
> And otherwise just extent_map::disk_bytenr.
>
> And this is already validated by the validate_extent_map().
> Now we can remove the member.
>
> However there is a special case in btrfs_alloc_ordered_extent(), where
> we intentionally pass a pseudo ordered extent, exploiting the fact that
> for NOCOW/PREALLOC writes we do not rely on ordered extent members to
> update the file extent items.
>
> And that's the only way to pass btrfs_extract_ordered_extent(), as it
> doesn't accept any ordered extent with an offset.
>
> For now we will keep the old pseudo ordered extent members, and leave
> the cleanup of it for the future.

These last 3 paragraphs, the rant about NOCOW writes and ordered
extents, seem unnecessary to me.

This is just how things work, and for me it makes total sense that an
ordered extent for a NOCOW write does not represent the entirety of an
existing file extent item.
NOCOW writes don't create new file extent items, so they can refer
only to a section of an existing extent (or the whole extent).

I don't see how this rant is relevant to have here, as the patchset is
about extent maps and not ordered extents.
I would leave it out, as it's a separate thing and doesn't affect anything here.

More comments inlined below.

>
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> Signed-off-by: David Sterba <dsterba@suse.com>
> ---
>  fs/btrfs/compression.c            |  3 +-
>  fs/btrfs/defrag.c                 |  9 ++-
>  fs/btrfs/extent_io.c              | 10 ++--
>  fs/btrfs/extent_map.c             | 56 +++++------------
>  fs/btrfs/extent_map.h             | 22 ++++---
>  fs/btrfs/file-item.c              |  4 --
>  fs/btrfs/file.c                   | 11 ++--
>  fs/btrfs/inode.c                  | 84 +++++++++++++++-----------
>  fs/btrfs/relocation.c             |  1 -
>  fs/btrfs/tests/extent-map-tests.c | 48 ++++++---------
>  fs/btrfs/tests/inode-tests.c      | 99 ++++++++++++++++---------------
>  fs/btrfs/tree-log.c               | 17 +++---
>  fs/btrfs/zoned.c                  |  4 +-
>  include/trace/events/btrfs.h      | 11 +---
>  14 files changed, 172 insertions(+), 207 deletions(-)
>
> diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
> index 3af87911c83e..414adbba07b8 100644
> --- a/fs/btrfs/compression.c
> +++ b/fs/btrfs/compression.c
> @@ -507,7 +507,8 @@ static noinline int add_ra_bio_pages(struct inode *inode,
>                  */
>                 if (!em || cur < em->start ||
>                     (cur + fs_info->sectorsize > extent_map_end(em)) ||
> -                   (em->block_start >> SECTOR_SHIFT) != orig_bio->bi_iter.bi_sector) {
> +                   (extent_map_block_start(em) >> SECTOR_SHIFT) !=
> +                   orig_bio->bi_iter.bi_sector) {
>                         free_extent_map(em);
>                         unlock_extent(tree, cur, page_end, NULL);
>                         unlock_page(page);
> diff --git a/fs/btrfs/defrag.c b/fs/btrfs/defrag.c
> index 025e7f853a68..6fb94e897fc5 100644
> --- a/fs/btrfs/defrag.c
> +++ b/fs/btrfs/defrag.c
> @@ -707,7 +707,6 @@ static struct extent_map *defrag_get_extent(struct btrfs_inode *inode,
>                  */
>                 if (key.offset > start) {
>                         em->start = start;
> -                       em->block_start = EXTENT_MAP_HOLE;
>                         em->disk_bytenr = EXTENT_MAP_HOLE;
>                         em->disk_num_bytes = 0;
>                         em->ram_bytes = 0;
> @@ -828,7 +827,7 @@ static bool defrag_check_next_extent(struct inode *inode, struct extent_map *em,
>          */
>         next = defrag_lookup_extent(inode, em->start + em->len, newer_than, locked);
>         /* No more em or hole */
> -       if (!next || next->block_start >= EXTENT_MAP_LAST_BYTE)
> +       if (!next || next->disk_bytenr >= EXTENT_MAP_LAST_BYTE)
>                 goto out;
>         if (next->flags & EXTENT_FLAG_PREALLOC)
>                 goto out;
> @@ -995,12 +994,12 @@ static int defrag_collect_targets(struct btrfs_inode *inode,
>                  * This is for users who want to convert inline extents to
>                  * regular ones through max_inline= mount option.
>                  */
> -               if (em->block_start == EXTENT_MAP_INLINE &&
> +               if (em->disk_bytenr == EXTENT_MAP_INLINE &&
>                     em->len <= inode->root->fs_info->max_inline)
>                         goto next;
>
>                 /* Skip holes and preallocated extents. */
> -               if (em->block_start == EXTENT_MAP_HOLE ||
> +               if (em->disk_bytenr == EXTENT_MAP_HOLE ||
>                     (em->flags & EXTENT_FLAG_PREALLOC))
>                         goto next;
>
> @@ -1065,7 +1064,7 @@ static int defrag_collect_targets(struct btrfs_inode *inode,
>                  * So if an inline extent passed all above checks, just add it
>                  * for defrag, and be converted to regular extents.
>                  */
> -               if (em->block_start == EXTENT_MAP_INLINE)
> +               if (em->disk_bytenr == EXTENT_MAP_INLINE)
>                         goto add;
>
>                 next_mergeable = defrag_check_next_extent(&inode->vfs_inode, em,
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 597387e9f040..ef9928cc6467 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -1083,10 +1083,10 @@ static int btrfs_do_readpage(struct page *page, struct extent_map **em_cached,
>                 iosize = min(extent_map_end(em) - cur, end - cur + 1);
>                 iosize = ALIGN(iosize, blocksize);
>                 if (compress_type != BTRFS_COMPRESS_NONE)
> -                       disk_bytenr = em->block_start;
> +                       disk_bytenr = em->disk_bytenr;
>                 else
> -                       disk_bytenr = em->block_start + extent_offset;
> -               block_start = em->block_start;
> +                       disk_bytenr = extent_map_block_start(em) + extent_offset;
> +               block_start = extent_map_block_start(em);
>                 if (em->flags & EXTENT_FLAG_PREALLOC)
>                         block_start = EXTENT_MAP_HOLE;
>
> @@ -1405,8 +1405,8 @@ static noinline_for_stack int __extent_writepage_io(struct btrfs_inode *inode,
>                 ASSERT(IS_ALIGNED(em->start, fs_info->sectorsize));
>                 ASSERT(IS_ALIGNED(em->len, fs_info->sectorsize));
>
> -               block_start = em->block_start;
> -               disk_bytenr = em->block_start + extent_offset;
> +               block_start = extent_map_block_start(em);
> +               disk_bytenr = extent_map_block_start(em) + extent_offset;
>
>                 ASSERT(!extent_map_is_compressed(em));
>                 ASSERT(block_start != EXTENT_MAP_HOLE);
> diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
> index dcd191c2c4b3..9ae86125599a 100644
> --- a/fs/btrfs/extent_map.c
> +++ b/fs/btrfs/extent_map.c
> @@ -195,9 +195,10 @@ static inline u64 extent_map_block_len(const struct extent_map *em)
>
>  static inline u64 extent_map_block_end(const struct extent_map *em)
>  {
> -       if (em->block_start + extent_map_block_len(em) < em->block_start)
> +       if (extent_map_block_start(em) + extent_map_block_len(em) <
> +           extent_map_block_start(em))
>                 return (u64)-1;
> -       return em->block_start + extent_map_block_len(em);
> +       return extent_map_block_start(em) + extent_map_block_len(em);
>  }
>
>  static bool can_merge_extent_map(const struct extent_map *em)
> @@ -232,11 +233,11 @@ static bool mergeable_maps(const struct extent_map *prev, const struct extent_ma
>         if (prev->flags != next->flags)
>                 return false;
>
> -       if (next->block_start < EXTENT_MAP_LAST_BYTE - 1)
> -               return next->block_start == extent_map_block_end(prev);
> +       if (next->disk_bytenr < EXTENT_MAP_LAST_BYTE - 1)
> +               return extent_map_block_start(next) == extent_map_block_end(prev);
>
>         /* HOLES and INLINE extents. */
> -       return next->block_start == prev->block_start;
> +       return next->disk_bytenr == prev->disk_bytenr;
>  }
>
>  /*
> @@ -295,10 +296,9 @@ static void dump_extent_map(const char *prefix, struct extent_map *em)
>  {
>         if (!IS_ENABLED(CONFIG_BTRFS_DEBUG))
>                 return;
> -       pr_crit("%s, start=%llu len=%llu disk_bytenr=%llu disk_num_bytes=%llu ram_bytes=%llu offset=%llu block_start=%llu flags=0x%x\n",
> +       pr_crit("%s, start=%llu len=%llu disk_bytenr=%llu disk_num_bytes=%llu ram_bytes=%llu offset=%llu flags=0x%x\n",
>                 prefix, em->start, em->len, em->disk_bytenr, em->disk_num_bytes,
> -               em->ram_bytes, em->offset, em->block_start,
> -               em->flags);
> +               em->ram_bytes, em->offset, em->flags);
>         ASSERT(0);
>  }
>
> @@ -315,16 +315,6 @@ static void validate_extent_map(struct extent_map *em)
>                 if (em->offset + em->len > em->disk_num_bytes &&
>                     !extent_map_is_compressed(em))
>                         dump_extent_map("disk_num_bytes too small", em);
> -
> -               if (extent_map_is_compressed(em)) {
> -                       if (em->block_start != em->disk_bytenr)
> -                               dump_extent_map(
> -                               "mismatch block_start/disk_bytenr/offset", em);
> -               } else {
> -                       if (em->block_start != em->disk_bytenr + em->offset)
> -                               dump_extent_map(
> -                               "mismatch block_start/disk_bytenr/offset", em);
> -               }
>         } else {
>                 if (em->offset)
>                         dump_extent_map("non-zero offset for hole/inline", em);
> @@ -358,7 +348,6 @@ static void try_merge_map(struct btrfs_inode *inode, struct extent_map *em)
>                 if (rb && can_merge_extent_map(merge) && mergeable_maps(merge, em)) {
>                         em->start = merge->start;
>                         em->len += merge->len;
> -                       em->block_start = merge->block_start;
>                         em->generation = max(em->generation, merge->generation);
>
>                         if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE)
> @@ -668,11 +657,9 @@ static noinline int merge_extent_mapping(struct btrfs_inode *inode,
>         start_diff = start - em->start;
>         em->start = start;
>         em->len = end - start;
> -       if (em->block_start < EXTENT_MAP_LAST_BYTE &&
> -           !extent_map_is_compressed(em)) {
> -               em->block_start += start_diff;
> +       if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE &&
> +           !extent_map_is_compressed(em))
>                 em->offset += start_diff;
> -       }
>         return add_extent_mapping(inode, em, 0);
>  }
>
> @@ -707,7 +694,7 @@ int btrfs_add_extent_mapping(struct btrfs_inode *inode,
>          * Tree-checker should have rejected any inline extent with non-zero
>          * file offset. Here just do a sanity check.
>          */
> -       if (em->block_start == EXTENT_MAP_INLINE)
> +       if (em->disk_bytenr == EXTENT_MAP_INLINE)
>                 ASSERT(em->start == 0);
>
>         ret = add_extent_mapping(inode, em, 0);
> @@ -836,7 +823,6 @@ void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
>                 u64 gen;
>                 unsigned long flags;
>                 bool modified;
> -               bool compressed;
>
>                 if (em_end < end) {
>                         next_em = next_extent_map(em);
> @@ -870,7 +856,6 @@ void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
>                         goto remove_em;
>
>                 gen = em->generation;
> -               compressed = extent_map_is_compressed(em);
>
>                 if (em->start < start) {
>                         if (!split) {
> @@ -882,15 +867,12 @@ void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
>                         split->start = em->start;
>                         split->len = start - em->start;
>
> -                       if (em->block_start < EXTENT_MAP_LAST_BYTE) {
> -                               split->block_start = em->block_start;
> -
> +                       if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) {
>                                 split->disk_bytenr = em->disk_bytenr;
>                                 split->disk_num_bytes = em->disk_num_bytes;
>                                 split->offset = em->offset;
>                                 split->ram_bytes = em->ram_bytes;
>                         } else {
> -                               split->block_start = em->block_start;
>                                 split->disk_bytenr = em->disk_bytenr;
>                                 split->disk_num_bytes = 0;
>                                 split->offset = 0;
> @@ -913,20 +895,14 @@ void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
>                         }
>                         split->start = end;
>                         split->len = em_end - end;
> -                       split->block_start = em->block_start;
>                         split->disk_bytenr = em->disk_bytenr;
>                         split->flags = flags;
>                         split->generation = gen;
>
> -                       if (em->block_start < EXTENT_MAP_LAST_BYTE) {
> +                       if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) {
>                                 split->disk_num_bytes = em->disk_num_bytes;
>                                 split->offset = em->offset + end - em->start;
>                                 split->ram_bytes = em->ram_bytes;
> -                               if (!compressed) {
> -                                       const u64 diff = end - em->start;
> -
> -                                       split->block_start += diff;
> -                               }
>                         } else {
>                                 split->disk_num_bytes = 0;
>                                 split->offset = 0;
> @@ -1073,7 +1049,7 @@ int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
>
>         ASSERT(em->len == len);
>         ASSERT(!extent_map_is_compressed(em));
> -       ASSERT(em->block_start < EXTENT_MAP_LAST_BYTE);
> +       ASSERT(em->disk_bytenr < EXTENT_MAP_LAST_BYTE);
>         ASSERT(em->flags & EXTENT_FLAG_PINNED);
>         ASSERT(!(em->flags & EXTENT_FLAG_LOGGING));
>         ASSERT(!list_empty(&em->list));
> @@ -1087,7 +1063,6 @@ int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
>         split_pre->disk_bytenr = new_logical;
>         split_pre->disk_num_bytes = split_pre->len;
>         split_pre->offset = 0;
> -       split_pre->block_start = new_logical;
>         split_pre->ram_bytes = split_pre->len;
>         split_pre->flags = flags;
>         split_pre->generation = em->generation;
> @@ -1102,10 +1077,9 @@ int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
>         /* Insert the middle extent_map. */
>         split_mid->start = em->start + pre;
>         split_mid->len = em->len - pre;
> -       split_mid->disk_bytenr = em->block_start + pre;
> +       split_mid->disk_bytenr = extent_map_block_start(em) + pre;
>         split_mid->disk_num_bytes = split_mid->len;
>         split_mid->offset = 0;
> -       split_mid->block_start = em->block_start + pre;
>         split_mid->ram_bytes = split_mid->len;
>         split_mid->flags = flags;
>         split_mid->generation = em->generation;
> diff --git a/fs/btrfs/extent_map.h b/fs/btrfs/extent_map.h
> index aee721eaa7f3..a0e7f49ec88f 100644
> --- a/fs/btrfs/extent_map.h
> +++ b/fs/btrfs/extent_map.h
> @@ -90,18 +90,6 @@ struct extent_map {
>          */
>         u64 ram_bytes;
>
> -       /*
> -        * The on-disk logical bytenr for the file extent.
> -        *
> -        * For compressed extents it matches btrfs_file_extent_item::disk_bytenr.
> -        * For uncompressed extents it matches
> -        * btrfs_file_extent_item::disk_bytenr + btrfs_file_extent_item::offset
> -        *
> -        * For holes it is EXTENT_MAP_HOLE and for inline extents it is
> -        * EXTENT_MAP_INLINE.
> -        */
> -       u64 block_start;
> -
>         /*
>          * Generation of the extent map, for merged em it's the highest
>          * generation of all merged ems.
> @@ -162,6 +150,16 @@ static inline int extent_map_in_tree(const struct extent_map *em)
>         return !RB_EMPTY_NODE(&em->rb_node);
>  }
>
> +static inline u64 extent_map_block_start(const struct extent_map *em)
> +{
> +       if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) {
> +               if (extent_map_is_compressed(em))
> +                       return em->disk_bytenr;
> +               return em->disk_bytenr + em->offset;
> +       }
> +       return em->disk_bytenr;
> +}
> +
>  static inline u64 extent_map_end(const struct extent_map *em)
>  {
>         if (em->start + em->len < em->start)
> diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
> index 95fb7c059a1a..b8e213a1a8ee 100644
> --- a/fs/btrfs/file-item.c
> +++ b/fs/btrfs/file-item.c
> @@ -1294,7 +1294,6 @@ void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode,
>                 em->len = btrfs_file_extent_end(path) - extent_start;
>                 bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
>                 if (bytenr == 0) {
> -                       em->block_start = EXTENT_MAP_HOLE;
>                         em->disk_bytenr = EXTENT_MAP_HOLE;
>                         em->disk_num_bytes = 0;
>                         em->offset = 0;
> @@ -1305,10 +1304,8 @@ void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode,
>                 em->offset = btrfs_file_extent_offset(leaf, fi);
>                 if (compress_type != BTRFS_COMPRESS_NONE) {
>                         extent_map_set_compression(em, compress_type);
> -                       em->block_start = bytenr;
>                 } else {
>                         bytenr += btrfs_file_extent_offset(leaf, fi);
> -                       em->block_start = bytenr;
>                         if (type == BTRFS_FILE_EXTENT_PREALLOC)
>                                 em->flags |= EXTENT_FLAG_PREALLOC;
>                 }
> @@ -1316,7 +1313,6 @@ void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode,
>                 /* Tree-checker has ensured this. */
>                 ASSERT(extent_start == 0);
>
> -               em->block_start = EXTENT_MAP_INLINE;
>                 em->disk_bytenr = EXTENT_MAP_INLINE;
>                 em->start = 0;
>                 em->len = fs_info->sectorsize;
> diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
> index 05c7b5429b85..102b5c17ece1 100644
> --- a/fs/btrfs/file.c
> +++ b/fs/btrfs/file.c
> @@ -2335,7 +2335,6 @@ static int fill_holes(struct btrfs_trans_handle *trans,
>                 hole_em->len = end - offset;
>                 hole_em->ram_bytes = hole_em->len;
>
> -               hole_em->block_start = EXTENT_MAP_HOLE;
>                 hole_em->disk_bytenr = EXTENT_MAP_HOLE;
>                 hole_em->disk_num_bytes = 0;
>                 hole_em->generation = trans->transid;
> @@ -2368,7 +2367,7 @@ static int find_first_non_hole(struct btrfs_inode *inode, u64 *start, u64 *len)
>                 return PTR_ERR(em);
>
>         /* Hole or vacuum extent(only exists in no-hole mode) */
> -       if (em->block_start == EXTENT_MAP_HOLE) {
> +       if (em->disk_bytenr == EXTENT_MAP_HOLE) {
>                 ret = 1;
>                 *len = em->start + em->len > *start + *len ?
>                        0 : *start + *len - em->start - em->len;
> @@ -3025,7 +3024,7 @@ static int btrfs_zero_range_check_range_boundary(struct btrfs_inode *inode,
>         if (IS_ERR(em))
>                 return PTR_ERR(em);
>
> -       if (em->block_start == EXTENT_MAP_HOLE)
> +       if (em->disk_bytenr == EXTENT_MAP_HOLE)
>                 ret = RANGE_BOUNDARY_HOLE;
>         else if (em->flags & EXTENT_FLAG_PREALLOC)
>                 ret = RANGE_BOUNDARY_PREALLOC_EXTENT;
> @@ -3089,7 +3088,7 @@ static int btrfs_zero_range(struct inode *inode,
>                 ASSERT(IS_ALIGNED(alloc_start, sectorsize));
>                 len = offset + len - alloc_start;
>                 offset = alloc_start;
> -               alloc_hint = em->block_start + em->len;
> +               alloc_hint = extent_map_block_start(em) + em->len;
>         }
>         free_extent_map(em);
>
> @@ -3107,7 +3106,7 @@ static int btrfs_zero_range(struct inode *inode,
>                                                            mode);
>                         goto out;
>                 }
> -               if (len < sectorsize && em->block_start != EXTENT_MAP_HOLE) {
> +               if (len < sectorsize && em->disk_bytenr != EXTENT_MAP_HOLE) {
>                         free_extent_map(em);
>                         ret = btrfs_truncate_block(BTRFS_I(inode), offset, len,
>                                                    0);
> @@ -3320,7 +3319,7 @@ static long btrfs_fallocate(struct file *file, int mode,
>                 last_byte = min(extent_map_end(em), alloc_end);
>                 actual_end = min_t(u64, extent_map_end(em), offset + len);
>                 last_byte = ALIGN(last_byte, blocksize);
> -               if (em->block_start == EXTENT_MAP_HOLE ||
> +               if (em->disk_bytenr == EXTENT_MAP_HOLE ||
>                     (cur_offset >= inode->i_size &&
>                      !(em->flags & EXTENT_FLAG_PREALLOC))) {
>                         const u64 range_len = last_byte - cur_offset;
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 7df295e0046d..8bc1f165193a 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -138,7 +138,7 @@ static noinline int run_delalloc_cow(struct btrfs_inode *inode,
>                                      u64 end, struct writeback_control *wbc,
>                                      bool pages_dirty);
>  static struct extent_map *create_io_em(struct btrfs_inode *inode, u64 start,
> -                                      u64 len, u64 block_start,
> +                                      u64 len,
>                                        u64 disk_num_bytes,
>                                        u64 ram_bytes, int compress_type,
>                                        struct btrfs_file_extent *file_extent,
> @@ -1209,7 +1209,6 @@ static void submit_one_async_extent(struct async_chunk *async_chunk,
>
>         em = create_io_em(inode, start,
>                           async_extent->ram_size,       /* len */
> -                         ins.objectid,                 /* block_start */
>                           ins.offset,                   /* orig_block_len */
>                           async_extent->ram_size,       /* ram_bytes */
>                           async_extent->compress_type,
> @@ -1287,15 +1286,15 @@ static u64 get_extent_allocation_hint(struct btrfs_inode *inode, u64 start,
>                  * first block in this inode and use that as a hint.  If that
>                  * block is also bogus then just don't worry about it.
>                  */
> -               if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> +               if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
>                         free_extent_map(em);
>                         em = search_extent_mapping(em_tree, 0, 0);
> -                       if (em && em->block_start < EXTENT_MAP_LAST_BYTE)
> -                               alloc_hint = em->block_start;
> +                       if (em && em->disk_bytenr < EXTENT_MAP_LAST_BYTE)
> +                               alloc_hint = extent_map_block_start(em);
>                         if (em)
>                                 free_extent_map(em);
>                 } else {
> -                       alloc_hint = em->block_start;
> +                       alloc_hint = extent_map_block_start(em);
>                         free_extent_map(em);
>                 }
>         }
> @@ -1451,7 +1450,6 @@ static noinline int cow_file_range(struct btrfs_inode *inode,
>                             &cached);
>
>                 em = create_io_em(inode, start, ins.offset, /* len */
> -                                 ins.objectid, /* block_start */
>                                   ins.offset, /* orig_block_len */
>                                   ram_size, /* ram_bytes */
>                                   BTRFS_COMPRESS_NONE, /* compress_type */
> @@ -2191,7 +2189,6 @@ static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
>                         struct extent_map *em;
>
>                         em = create_io_em(inode, cur_offset, nocow_args.num_bytes,
> -                                         nocow_args.disk_bytenr, /* block_start */
>                                           nocow_args.disk_num_bytes, /* orig_block_len */
>                                           ram_bytes, BTRFS_COMPRESS_NONE,
>                                           &nocow_args.file_extent,
> @@ -2706,7 +2703,7 @@ static int btrfs_find_new_delalloc_bytes(struct btrfs_inode *inode,
>                 if (IS_ERR(em))
>                         return PTR_ERR(em);
>
> -               if (em->block_start != EXTENT_MAP_HOLE)
> +               if (extent_map_block_start(em) != EXTENT_MAP_HOLE)
>                         goto next;
>
>                 em_len = em->len;
> @@ -4993,7 +4990,6 @@ int btrfs_cont_expand(struct btrfs_inode *inode, loff_t oldsize, loff_t size)
>                         hole_em->start = cur_offset;
>                         hole_em->len = hole_size;
>
> -                       hole_em->block_start = EXTENT_MAP_HOLE;
>                         hole_em->disk_bytenr = EXTENT_MAP_HOLE;
>                         hole_em->disk_num_bytes = 0;
>                         hole_em->ram_bytes = hole_size;
> @@ -6842,7 +6838,7 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
>         if (em) {
>                 if (em->start > start || em->start + em->len <= start)
>                         free_extent_map(em);
> -               else if (em->block_start == EXTENT_MAP_INLINE && page)
> +               else if (em->disk_bytenr == EXTENT_MAP_INLINE && page)
>                         free_extent_map(em);
>                 else
>                         goto out;
> @@ -6945,7 +6941,7 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
>                 /* New extent overlaps with existing one */
>                 em->start = start;
>                 em->len = found_key.offset - start;
> -               em->block_start = EXTENT_MAP_HOLE;
> +               em->disk_bytenr = EXTENT_MAP_HOLE;
>                 goto insert;
>         }
>
> @@ -6969,7 +6965,7 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
>                  *
>                  * Other members are not utilized for inline extents.
>                  */
> -               ASSERT(em->block_start == EXTENT_MAP_INLINE);
> +               ASSERT(em->disk_bytenr == EXTENT_MAP_INLINE);
>                 ASSERT(em->len == fs_info->sectorsize);
>
>                 ret = read_inline_extent(inode, path, page);
> @@ -6980,7 +6976,7 @@ struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
>  not_found:
>         em->start = start;
>         em->len = len;
> -       em->block_start = EXTENT_MAP_HOLE;
> +       em->disk_bytenr = EXTENT_MAP_HOLE;
>  insert:
>         ret = 0;
>         btrfs_release_path(path);
> @@ -7011,7 +7007,6 @@ static struct extent_map *btrfs_create_dio_extent(struct btrfs_inode *inode,
>                                                   struct btrfs_dio_data *dio_data,
>                                                   const u64 start,
>                                                   const u64 len,
> -                                                 const u64 block_start,
>                                                   const u64 orig_block_len,
>                                                   const u64 ram_bytes,
>                                                   const int type,
> @@ -7021,15 +7016,38 @@ static struct extent_map *btrfs_create_dio_extent(struct btrfs_inode *inode,
>         struct btrfs_ordered_extent *ordered;
>
>         if (type != BTRFS_ORDERED_NOCOW) {
> -               em = create_io_em(inode, start, len, block_start,
> +               em = create_io_em(inode, start, len,
>                                   orig_block_len, ram_bytes,
>                                   BTRFS_COMPRESS_NONE, /* compress_type */
>                                   file_extent, type);
>                 if (IS_ERR(em))
>                         goto out;
>         }
> +
> +       /*
> +        * NOTE: I know the numbers are totally wrong for NOCOW/PREALLOC,
> +        * but it doesn't cause problem at least for now.

They are not wrong, they are what they must be.

This is all about passing the right values to
btrfs_alloc_ordered_extent(), which has nothing to do with extent
maps.

> +        *
> +        * For regular writes, we would have file_extent->offset as 0,
> +        * thus we really only need disk_bytenr, every other length
> +        * (disk_num_bytes/ram_bytes) would match @len and fe->num_bytes.
> +        * The current numbers are totally fine.
> +        *
> +        * For NOCOW, we don't really care about the numbers except @file_pos

I don't see any variable named @file_pos anywhere in this function.

> +        * and @num_bytes, as we won't insert a file extent item at all.

There's no @num_bytes either, there's a @len however.

> +        *
> +        * For PREALLOC, we do not use ordered extent's member, but

ordered extent's member -> ordered extent members

> +        * btrfs_mark_extent_written() would handle everything.

would handle -> handles

> +        *
> +        * So here we intentionally go with pseudo numbers for the NOCOW/PREALLOC
> +        * OEs, or btrfs_extract_ordered_extent() would need a completely new
> +        * routine to handle NOCOW/PREALLOC splits, meanwhile result nothing
> +        * different.
> +        */

I would just leave the entire comment out.

>         ordered = btrfs_alloc_ordered_extent(inode, start, len, len,
> -                                            block_start, len, 0,
> +                                            file_extent->disk_bytenr +
> +                                            file_extent->offset,
> +                                            len, 0,
>                                              (1 << type) |
>                                              (1 << BTRFS_ORDERED_DIRECT),
>                                              BTRFS_COMPRESS_NONE);
> @@ -7081,7 +7099,7 @@ static struct extent_map *btrfs_new_extent_direct(struct btrfs_inode *inode,
>         file_extent.offset = 0;
>         file_extent.compression = BTRFS_COMPRESS_NONE;
>         em = btrfs_create_dio_extent(inode, dio_data, start, ins.offset,
> -                                    ins.objectid, ins.offset,
> +                                    ins.offset,
>                                      ins.offset, BTRFS_ORDERED_REGULAR,
>                                      &file_extent);
>         btrfs_dec_block_group_reservations(fs_info, ins.objectid);
> @@ -7321,7 +7339,7 @@ static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend,
>
>  /* The callers of this must take lock_extent() */
>  static struct extent_map *create_io_em(struct btrfs_inode *inode, u64 start,
> -                                      u64 len, u64 block_start,
> +                                      u64 len,
>                                        u64 disk_num_bytes,
>                                        u64 ram_bytes, int compress_type,
>                                        struct btrfs_file_extent *file_extent,
> @@ -7373,7 +7391,6 @@ static struct extent_map *create_io_em(struct btrfs_inode *inode, u64 start,
>
>         em->start = start;
>         em->len = len;
> -       em->block_start = block_start;
>         em->disk_bytenr = file_extent->disk_bytenr;
>         em->disk_num_bytes = disk_num_bytes;
>         em->ram_bytes = ram_bytes;
> @@ -7424,13 +7441,13 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map,
>          */
>         if ((em->flags & EXTENT_FLAG_PREALLOC) ||
>             ((BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW) &&
> -            em->block_start != EXTENT_MAP_HOLE)) {
> +            em->disk_bytenr != EXTENT_MAP_HOLE)) {
>                 if (em->flags & EXTENT_FLAG_PREALLOC)
>                         type = BTRFS_ORDERED_PREALLOC;
>                 else
>                         type = BTRFS_ORDERED_NOCOW;
>                 len = min(len, em->len - (start - em->start));
> -               block_start = em->block_start + (start - em->start);
> +               block_start = extent_map_block_start(em) + (start - em->start);
>
>                 if (can_nocow_extent(inode, start, &len,
>                                      &orig_block_len, &ram_bytes,
> @@ -7460,7 +7477,6 @@ static int btrfs_get_blocks_direct_write(struct extent_map **map,
>                 space_reserved = true;
>
>                 em2 = btrfs_create_dio_extent(BTRFS_I(inode), dio_data, start, len,
> -                                             block_start,
>                                               orig_block_len,
>                                               ram_bytes, type,
>                                               &file_extent);
> @@ -7663,7 +7679,7 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
>          * the generic code.
>          */
>         if (extent_map_is_compressed(em) ||
> -           em->block_start == EXTENT_MAP_INLINE) {
> +           em->disk_bytenr == EXTENT_MAP_INLINE) {
>                 free_extent_map(em);
>                 /*
>                  * If we are in a NOWAIT context, return -EAGAIN in order to
> @@ -7757,12 +7773,12 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
>          * We trim the extents (and move the addr) even though iomap code does
>          * that, since we have locked only the parts we are performing I/O in.
>          */
> -       if ((em->block_start == EXTENT_MAP_HOLE) ||
> +       if ((em->disk_bytenr == EXTENT_MAP_HOLE) ||
>             ((em->flags & EXTENT_FLAG_PREALLOC) && !write)) {
>                 iomap->addr = IOMAP_NULL_ADDR;
>                 iomap->type = IOMAP_HOLE;
>         } else {
> -               iomap->addr = em->block_start + (start - em->start);
> +               iomap->addr = extent_map_block_start(em) + (start - em->start);
>                 iomap->type = IOMAP_MAPPED;
>         }
>         iomap->offset = start;
> @@ -9612,7 +9628,6 @@ static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
>
>                 em->start = cur_offset;
>                 em->len = ins.offset;
> -               em->block_start = ins.objectid;
>                 em->disk_bytenr = ins.objectid;
>                 em->offset = 0;
>                 em->disk_num_bytes = ins.offset;
> @@ -10078,7 +10093,7 @@ ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
>                 goto out_unlock_extent;
>         }
>
> -       if (em->block_start == EXTENT_MAP_INLINE) {
> +       if (em->disk_bytenr == EXTENT_MAP_INLINE) {
>                 u64 extent_start = em->start;
>
>                 /*
> @@ -10099,14 +10114,14 @@ ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
>          */
>         encoded->len = min_t(u64, extent_map_end(em),
>                              inode->vfs_inode.i_size) - iocb->ki_pos;
> -       if (em->block_start == EXTENT_MAP_HOLE ||
> +       if (em->disk_bytenr == EXTENT_MAP_HOLE ||
>             (em->flags & EXTENT_FLAG_PREALLOC)) {
>                 disk_bytenr = EXTENT_MAP_HOLE;
>                 count = min_t(u64, count, encoded->len);
>                 encoded->len = count;
>                 encoded->unencoded_len = count;
>         } else if (extent_map_is_compressed(em)) {
> -               disk_bytenr = em->block_start;
> +               disk_bytenr = em->disk_bytenr;
>                 /*
>                  * Bail if the buffer isn't large enough to return the whole
>                  * compressed extent.
> @@ -10125,7 +10140,7 @@ ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
>                         goto out_em;
>                 encoded->compression = ret;
>         } else {
> -               disk_bytenr = em->block_start + (start - em->start);
> +               disk_bytenr = extent_map_block_start(em) + (start - em->start);
>                 if (encoded->len > count)
>                         encoded->len = count;
>                 /*
> @@ -10363,7 +10378,6 @@ ssize_t btrfs_do_encoded_write(struct kiocb *iocb, struct iov_iter *from,
>         file_extent.offset = encoded->unencoded_offset;
>         file_extent.compression = compression;
>         em = create_io_em(inode, start, num_bytes,
> -                         ins.objectid,
>                           ins.offset, ram_bytes, compression,
>                           &file_extent, BTRFS_ORDERED_COMPRESSED);
>         if (IS_ERR(em)) {
> @@ -10667,12 +10681,12 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
>                         goto out;
>                 }
>
> -               if (em->block_start == EXTENT_MAP_HOLE) {
> +               if (em->disk_bytenr == EXTENT_MAP_HOLE) {
>                         btrfs_warn(fs_info, "swapfile must not have holes");
>                         ret = -EINVAL;
>                         goto out;
>                 }
> -               if (em->block_start == EXTENT_MAP_INLINE) {
> +               if (em->disk_bytenr == EXTENT_MAP_INLINE) {
>                         /*
>                          * It's unlikely we'll ever actually find ourselves
>                          * here, as a file small enough to fit inline won't be
> @@ -10690,7 +10704,7 @@ static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
>                         goto out;
>                 }
>
> -               logical_block_start = em->block_start + (start - em->start);
> +               logical_block_start = extent_map_block_start(em) + (start - em->start);
>                 len = min(len, em->len - (start - em->start));
>                 free_extent_map(em);
>                 em = NULL;
> diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
> index a66d9b921f84..0d462c2a9c89 100644
> --- a/fs/btrfs/relocation.c
> +++ b/fs/btrfs/relocation.c
> @@ -2912,7 +2912,6 @@ static noinline_for_stack int setup_relocation_extent_mapping(struct inode *inod
>
>         em->start = start;
>         em->len = end + 1 - start;
> -       em->block_start = block_start;
>         em->disk_bytenr = block_start;
>         em->disk_num_bytes = em->len;
>         em->ram_bytes = em->len;
> diff --git a/fs/btrfs/tests/extent-map-tests.c b/fs/btrfs/tests/extent-map-tests.c
> index ffdaa6a682af..a145214be14b 100644
> --- a/fs/btrfs/tests/extent-map-tests.c
> +++ b/fs/btrfs/tests/extent-map-tests.c
> @@ -28,8 +28,8 @@ static int free_extent_map_tree(struct btrfs_inode *inode)
>                 if (refcount_read(&em->refs) != 1) {
>                         ret = -EINVAL;
>                         test_err(
> -"em leak: em (start %llu len %llu block_start %llu disk_num_bytes %llu offset %llu) refs %d",
> -                                em->start, em->len, em->block_start,
> +"em leak: em (start %llu len %llu disk_bytenr %llu disk_num_bytes %llu offset %llu) refs %d",
> +                                em->start, em->len, em->disk_bytenr,
>                                  em->disk_num_bytes, em->offset,
>                                  refcount_read(&em->refs));
>
> @@ -77,7 +77,6 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>         /* Add [0, 16K) */
>         em->start = 0;
>         em->len = SZ_16K;
> -       em->block_start = 0;
>         em->disk_bytenr = 0;
>         em->disk_num_bytes = SZ_16K;
>         em->ram_bytes = SZ_16K;
> @@ -100,7 +99,6 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>
>         em->start = SZ_16K;
>         em->len = SZ_4K;
> -       em->block_start = SZ_32K; /* avoid merging */
>         em->disk_bytenr = SZ_32K; /* avoid merging */
>         em->disk_num_bytes = SZ_4K;
>         em->ram_bytes = SZ_4K;
> @@ -123,7 +121,6 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>         /* Add [0, 8K), should return [0, 16K) instead. */
>         em->start = start;
>         em->len = len;
> -       em->block_start = start;
>         em->disk_bytenr = start;
>         em->disk_num_bytes = len;
>         em->ram_bytes = len;
> @@ -141,11 +138,11 @@ static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>                 goto out;
>         }
>         if (em->start != 0 || extent_map_end(em) != SZ_16K ||
> -           em->block_start != 0 || em->disk_num_bytes != SZ_16K) {
> +           em->disk_bytenr != 0 || em->disk_num_bytes != SZ_16K) {
>                 test_err(
> -"case1 [%llu %llu]: ret %d return a wrong em (start %llu len %llu block_start %llu disk_num_bytes %llu",
> +"case1 [%llu %llu]: ret %d return a wrong em (start %llu len %llu disk_bytenr %llu disk_num_bytes %llu",
>                          start, start + len, ret, em->start, em->len,
> -                        em->block_start, em->disk_num_bytes);
> +                        em->disk_bytenr, em->disk_num_bytes);
>                 ret = -EINVAL;
>         }
>         free_extent_map(em);
> @@ -179,7 +176,6 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>         /* Add [0, 1K) */
>         em->start = 0;
>         em->len = SZ_1K;
> -       em->block_start = EXTENT_MAP_INLINE;
>         em->disk_bytenr = EXTENT_MAP_INLINE;
>         em->disk_num_bytes = 0;
>         em->ram_bytes = SZ_1K;
> @@ -202,7 +198,6 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>
>         em->start = SZ_4K;
>         em->len = SZ_4K;
> -       em->block_start = SZ_4K;
>         em->disk_bytenr = SZ_4K;
>         em->disk_num_bytes = SZ_4K;
>         em->ram_bytes = SZ_4K;
> @@ -225,7 +220,6 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>         /* Add [0, 1K) */
>         em->start = 0;
>         em->len = SZ_1K;
> -       em->block_start = EXTENT_MAP_INLINE;
>         em->disk_bytenr = EXTENT_MAP_INLINE;
>         em->disk_num_bytes = 0;
>         em->ram_bytes = SZ_1K;
> @@ -242,10 +236,10 @@ static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>                 goto out;
>         }
>         if (em->start != 0 || extent_map_end(em) != SZ_1K ||
> -           em->block_start != EXTENT_MAP_INLINE) {
> +           em->disk_bytenr != EXTENT_MAP_INLINE) {
>                 test_err(
> -"case2 [0 1K]: ret %d return a wrong em (start %llu len %llu block_start %llu",
> -                        ret, em->start, em->len, em->block_start);
> +"case2 [0 1K]: ret %d return a wrong em (start %llu len %llu disk_bytenr %llu",
> +                        ret, em->start, em->len, em->disk_bytenr);
>                 ret = -EINVAL;
>         }
>         free_extent_map(em);
> @@ -275,7 +269,6 @@ static int __test_case_3(struct btrfs_fs_info *fs_info,
>         /* Add [4K, 8K) */
>         em->start = SZ_4K;
>         em->len = SZ_4K;
> -       em->block_start = SZ_4K;
>         em->disk_bytenr = SZ_4K;
>         em->disk_num_bytes = SZ_4K;
>         em->ram_bytes = SZ_4K;
> @@ -298,7 +291,6 @@ static int __test_case_3(struct btrfs_fs_info *fs_info,
>         /* Add [0, 16K) */
>         em->start = 0;
>         em->len = SZ_16K;
> -       em->block_start = 0;
>         em->disk_bytenr = 0;
>         em->disk_num_bytes = SZ_16K;
>         em->ram_bytes = SZ_16K;
> @@ -321,11 +313,11 @@ static int __test_case_3(struct btrfs_fs_info *fs_info,
>          * em->start.
>          */
>         if (start < em->start || start + len > extent_map_end(em) ||
> -           em->start != em->block_start) {
> +           em->start != extent_map_block_start(em)) {
>                 test_err(
> -"case3 [%llu %llu): ret %d em (start %llu len %llu block_start %llu block_len %llu)",
> +"case3 [%llu %llu): ret %d em (start %llu len %llu disk_bytenr %llu block_len %llu)",
>                          start, start + len, ret, em->start, em->len,
> -                        em->block_start, em->disk_num_bytes);
> +                        em->disk_bytenr, em->disk_num_bytes);
>                 ret = -EINVAL;
>         }
>         free_extent_map(em);
> @@ -386,7 +378,6 @@ static int __test_case_4(struct btrfs_fs_info *fs_info,
>         /* Add [0K, 8K) */
>         em->start = 0;
>         em->len = SZ_8K;
> -       em->block_start = 0;
>         em->disk_bytenr = 0;
>         em->disk_num_bytes = SZ_8K;
>         em->ram_bytes = SZ_8K;
> @@ -409,7 +400,6 @@ static int __test_case_4(struct btrfs_fs_info *fs_info,
>         /* Add [8K, 32K) */
>         em->start = SZ_8K;
>         em->len = 24 * SZ_1K;
> -       em->block_start = SZ_16K; /* avoid merging */
>         em->disk_bytenr = SZ_16K; /* avoid merging */
>         em->disk_num_bytes = 24 * SZ_1K;
>         em->ram_bytes = 24 * SZ_1K;
> @@ -431,7 +421,6 @@ static int __test_case_4(struct btrfs_fs_info *fs_info,
>         /* Add [0K, 32K) */
>         em->start = 0;
>         em->len = SZ_32K;
> -       em->block_start = 0;
>         em->disk_bytenr = 0;
>         em->disk_num_bytes = SZ_32K;
>         em->ram_bytes = SZ_32K;
> @@ -451,9 +440,9 @@ static int __test_case_4(struct btrfs_fs_info *fs_info,
>         }
>         if (start < em->start || start + len > extent_map_end(em)) {
>                 test_err(
> -"case4 [%llu %llu): ret %d, added wrong em (start %llu len %llu block_start %llu disk_num_bytes %llu)",
> -                        start, start + len, ret, em->start, em->len, em->block_start,
> -                        em->disk_num_bytes);
> +"case4 [%llu %llu): ret %d, added wrong em (start %llu len %llu disk_bytenr %llu disk_num_bytes %llu)",
> +                        start, start + len, ret, em->start, em->len,
> +                        em->disk_bytenr, em->disk_num_bytes);
>                 ret = -EINVAL;
>         }
>         free_extent_map(em);
> @@ -517,7 +506,6 @@ static int add_compressed_extent(struct btrfs_inode *inode,
>
>         em->start = start;
>         em->len = len;
> -       em->block_start = block_start;
>         em->disk_bytenr = block_start;
>         em->disk_num_bytes = SZ_4K;
>         em->ram_bytes = len;
> @@ -740,7 +728,6 @@ static int test_case_6(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>
>         em->start = SZ_4K;
>         em->len = SZ_4K;
> -       em->block_start = SZ_16K;
>         em->disk_bytenr = SZ_16K;
>         em->disk_num_bytes = SZ_16K;
>         em->ram_bytes = SZ_16K;
> @@ -795,7 +782,6 @@ static int test_case_7(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>         /* [0, 16K), pinned */
>         em->start = 0;
>         em->len = SZ_16K;
> -       em->block_start = 0;
>         em->disk_bytenr = 0;
>         em->disk_num_bytes = SZ_4K;
>         em->ram_bytes = SZ_16K;
> @@ -819,7 +805,6 @@ static int test_case_7(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>         /* [32K, 48K), not pinned */
>         em->start = SZ_32K;
>         em->len = SZ_16K;
> -       em->block_start = SZ_32K;
>         em->disk_bytenr = SZ_32K;
>         em->disk_num_bytes = SZ_16K;
>         em->ram_bytes = SZ_16K;
> @@ -885,8 +870,9 @@ static int test_case_7(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
>                 goto out;
>         }
>
> -       if (em->block_start != SZ_32K + SZ_4K) {
> -               test_err("em->block_start is %llu, expected 36K", em->block_start);
> +       if (extent_map_block_start(em) != SZ_32K + SZ_4K) {
> +               test_err("em->block_start is %llu, expected 36K",
> +                               extent_map_block_start(em));
>                 goto out;
>         }
>
> diff --git a/fs/btrfs/tests/inode-tests.c b/fs/btrfs/tests/inode-tests.c
> index 1b8c39edfc18..d6fd1978934a 100644
> --- a/fs/btrfs/tests/inode-tests.c
> +++ b/fs/btrfs/tests/inode-tests.c
> @@ -264,8 +264,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start != EXTENT_MAP_HOLE) {
> -               test_err("expected a hole, got %llu", em->block_start);
> +       if (em->disk_bytenr != EXTENT_MAP_HOLE) {
> +               test_err("expected a hole, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         free_extent_map(em);
> @@ -283,8 +283,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start != EXTENT_MAP_INLINE) {
> -               test_err("expected an inline, got %llu", em->block_start);
> +       if (em->disk_bytenr != EXTENT_MAP_INLINE) {
> +               test_err("expected an inline, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>
> @@ -321,8 +321,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start != EXTENT_MAP_HOLE) {
> -               test_err("expected a hole, got %llu", em->block_start);
> +       if (em->disk_bytenr != EXTENT_MAP_HOLE) {
> +               test_err("expected a hole, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != 4) {
> @@ -344,8 +344,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize - 1) {
> @@ -371,8 +371,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize) {
> @@ -389,7 +389,7 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("wrong offset, want 0, have %llu", em->offset);
>                 goto out;
>         }
> -       disk_bytenr = em->block_start;
> +       disk_bytenr = extent_map_block_start(em);
>         orig_start = em->start;
>         offset = em->start + em->len;
>         free_extent_map(em);
> @@ -399,8 +399,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start != EXTENT_MAP_HOLE) {
> -               test_err("expected a hole, got %llu", em->block_start);
> +       if (em->disk_bytenr != EXTENT_MAP_HOLE) {
> +               test_err("expected a hole, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize) {
> @@ -421,8 +421,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != 2 * sectorsize) {
> @@ -441,9 +441,9 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 goto out;
>         }
>         disk_bytenr += (em->start - orig_start);
> -       if (em->block_start != disk_bytenr) {
> +       if (extent_map_block_start(em) != disk_bytenr) {
>                 test_err("wrong block start, want %llu, have %llu",
> -                        disk_bytenr, em->block_start);
> +                        disk_bytenr, extent_map_block_start(em));
>                 goto out;
>         }
>         offset = em->start + em->len;
> @@ -455,8 +455,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize) {
> @@ -483,8 +483,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize) {
> @@ -502,7 +502,7 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("wrong offset, want 0, have %llu", em->offset);
>                 goto out;
>         }
> -       disk_bytenr = em->block_start;
> +       disk_bytenr = extent_map_block_start(em);
>         orig_start = em->start;
>         offset = em->start + em->len;
>         free_extent_map(em);
> @@ -512,8 +512,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_HOLE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_HOLE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize) {
> @@ -531,9 +531,9 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                          em->start - orig_start, em->offset);
>                 goto out;
>         }
> -       if (em->block_start != disk_bytenr + em->offset) {
> +       if (extent_map_block_start(em) != disk_bytenr + em->offset) {
>                 test_err("unexpected block start, wanted %llu, have %llu",
> -                        disk_bytenr + em->offset, em->block_start);
> +                        disk_bytenr + em->offset, extent_map_block_start(em));
>                 goto out;
>         }
>         offset = em->start + em->len;
> @@ -544,8 +544,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != 2 * sectorsize) {
> @@ -564,9 +564,9 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                          em->start - orig_start, em->offset);
>                 goto out;
>         }
> -       if (em->block_start != disk_bytenr + em->offset) {
> +       if (extent_map_block_start(em) != disk_bytenr + em->offset) {
>                 test_err("unexpected block start, wanted %llu, have %llu",
> -                        disk_bytenr + em->offset, em->block_start);
> +                        disk_bytenr + em->offset, extent_map_block_start(em));
>                 goto out;
>         }
>         offset = em->start + em->len;
> @@ -578,8 +578,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != 2 * sectorsize) {
> @@ -611,8 +611,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize) {
> @@ -635,7 +635,7 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                          BTRFS_COMPRESS_ZLIB, extent_map_compression(em));
>                 goto out;
>         }
> -       disk_bytenr = em->block_start;
> +       disk_bytenr = extent_map_block_start(em);
>         orig_start = em->start;
>         offset = em->start + em->len;
>         free_extent_map(em);
> @@ -645,8 +645,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize) {
> @@ -671,9 +671,9 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start != disk_bytenr) {
> +       if (extent_map_block_start(em) != disk_bytenr) {
>                 test_err("block start does not match, want %llu got %llu",
> -                        disk_bytenr, em->block_start);
> +                        disk_bytenr, extent_map_block_start(em));
>                 goto out;
>         }
>         if (em->start != offset || em->len != 2 * sectorsize) {
> @@ -706,8 +706,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize) {
> @@ -732,8 +732,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start != EXTENT_MAP_HOLE) {
> -               test_err("expected a hole extent, got %llu", em->block_start);
> +       if (em->disk_bytenr != EXTENT_MAP_HOLE) {
> +               test_err("expected a hole extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         /*
> @@ -764,8 +764,8 @@ static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
> +               test_err("expected a real extent, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != offset || em->len != sectorsize) {
> @@ -843,8 +843,8 @@ static int test_hole_first(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start != EXTENT_MAP_HOLE) {
> -               test_err("expected a hole, got %llu", em->block_start);
> +       if (em->disk_bytenr != EXTENT_MAP_HOLE) {
> +               test_err("expected a hole, got %llu", em->disk_bytenr);
>                 goto out;
>         }
>         if (em->start != 0 || em->len != sectorsize) {
> @@ -865,8 +865,9 @@ static int test_hole_first(u32 sectorsize, u32 nodesize)
>                 test_err("got an error when we shouldn't have");
>                 goto out;
>         }
> -       if (em->block_start != sectorsize) {
> -               test_err("expected a real extent, got %llu", em->block_start);
> +       if (extent_map_block_start(em) != sectorsize) {
> +               test_err("expected a real extent, got %llu",
> +                        extent_map_block_start(em));
>                 goto out;
>         }
>         if (em->start != sectorsize || em->len != sectorsize) {
> diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
> index 13f35180e3a0..c4b67bf993d6 100644
> --- a/fs/btrfs/tree-log.c
> +++ b/fs/btrfs/tree-log.c
> @@ -4575,6 +4575,7 @@ static int log_extent_csums(struct btrfs_trans_handle *trans,
>  {
>         struct btrfs_ordered_extent *ordered;
>         struct btrfs_root *csum_root;
> +       u64 block_start;
>         u64 csum_offset;
>         u64 csum_len;
>         u64 mod_start = em->start;
> @@ -4584,7 +4585,7 @@ static int log_extent_csums(struct btrfs_trans_handle *trans,
>
>         if (inode->flags & BTRFS_INODE_NODATASUM ||
>             (em->flags & EXTENT_FLAG_PREALLOC) ||
> -           em->block_start == EXTENT_MAP_HOLE)
> +           em->disk_bytenr == EXTENT_MAP_HOLE)
>                 return 0;
>
>         list_for_each_entry(ordered, &ctx->ordered_extents, log_list) {
> @@ -4655,9 +4656,10 @@ static int log_extent_csums(struct btrfs_trans_handle *trans,
>         }
>
>         /* block start is already adjusted for the file extent offset. */
> -       csum_root = btrfs_csum_root(trans->fs_info, em->block_start);
> -       ret = btrfs_lookup_csums_list(csum_root, em->block_start + csum_offset,
> -                                     em->block_start + csum_offset +
> +       block_start = extent_map_block_start(em);
> +       csum_root = btrfs_csum_root(trans->fs_info, block_start);
> +       ret = btrfs_lookup_csums_list(csum_root, block_start + csum_offset,
> +                                     block_start + csum_offset +
>                                       csum_len - 1, &ordered_sums, false);
>         if (ret < 0)
>                 return ret;
> @@ -4689,6 +4691,7 @@ static int log_one_extent(struct btrfs_trans_handle *trans,
>         struct btrfs_key key;
>         enum btrfs_compression_type compress_type;
>         u64 extent_offset = em->offset;
> +       u64 block_start = extent_map_block_start(em);
>         u64 block_len;
>         int ret;
>
> @@ -4701,10 +4704,10 @@ static int log_one_extent(struct btrfs_trans_handle *trans,
>         block_len = em->disk_num_bytes;
>         compress_type = extent_map_compression(em);
>         if (compress_type != BTRFS_COMPRESS_NONE) {
> -               btrfs_set_stack_file_extent_disk_bytenr(&fi, em->block_start);
> +               btrfs_set_stack_file_extent_disk_bytenr(&fi, block_start);
>                 btrfs_set_stack_file_extent_disk_num_bytes(&fi, block_len);
> -       } else if (em->block_start < EXTENT_MAP_LAST_BYTE) {
> -               btrfs_set_stack_file_extent_disk_bytenr(&fi, em->block_start -
> +       } else if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) {
> +               btrfs_set_stack_file_extent_disk_bytenr(&fi, block_start -
>                                                         extent_offset);
>                 btrfs_set_stack_file_extent_disk_num_bytes(&fi, block_len);
>         }
> diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
> index 4b52a8916dbb..6d0f7fc9aaf2 100644
> --- a/fs/btrfs/zoned.c
> +++ b/fs/btrfs/zoned.c
> @@ -1778,7 +1778,9 @@ static void btrfs_rewrite_logical_zoned(struct btrfs_ordered_extent *ordered,
>         write_lock(&em_tree->lock);
>         em = search_extent_mapping(em_tree, ordered->file_offset,
>                                    ordered->num_bytes);
> -       em->block_start = logical;
> +       /* The em should be a new COW extent, thus it should not has offset. */

not has offset -> not have an offset

Otherwise it seems fine, but I still want to go over the rest of the patchset.
I'm going slowly over it, and after commenting on each inidividual
patch, I'll comment on the cover letter.

Thanks.

> +       ASSERT(em->offset == 0);
> +       em->disk_bytenr = logical;
>         free_extent_map(em);
>         write_unlock(&em_tree->lock);
>  }
> diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h
> index 3743719d13f2..89b2b66e5bc0 100644
> --- a/include/trace/events/btrfs.h
> +++ b/include/trace/events/btrfs.h
> @@ -291,7 +291,6 @@ TRACE_EVENT_CONDITION(btrfs_get_extent,
>                 __field(        u64,  ino               )
>                 __field(        u64,  start             )
>                 __field(        u64,  len               )
> -               __field(        u64,  block_start       )
>                 __field(        u32,  flags             )
>                 __field(        int,  refs              )
>         ),
> @@ -301,18 +300,16 @@ TRACE_EVENT_CONDITION(btrfs_get_extent,
>                 __entry->ino            = btrfs_ino(inode);
>                 __entry->start          = map->start;
>                 __entry->len            = map->len;
> -               __entry->block_start    = map->block_start;
>                 __entry->flags          = map->flags;
>                 __entry->refs           = refcount_read(&map->refs);
>         ),
>
>         TP_printk_btrfs("root=%llu(%s) ino=%llu start=%llu len=%llu "
> -                 "block_start=%llu(%s) flags=%s refs=%u",
> +                 "flags=%s refs=%u",
>                   show_root_type(__entry->root_objectid),
>                   __entry->ino,
>                   __entry->start,
>                   __entry->len,
> -                 show_map_type(__entry->block_start),
>                   show_map_flags(__entry->flags),
>                   __entry->refs)
>  );
> @@ -2608,7 +2605,6 @@ TRACE_EVENT(btrfs_extent_map_shrinker_remove_em,
>                 __field(        u64,    root_id         )
>                 __field(        u64,    start           )
>                 __field(        u64,    len             )
> -               __field(        u64,    block_start     )
>                 __field(        u32,    flags           )
>         ),
>
> @@ -2617,15 +2613,12 @@ TRACE_EVENT(btrfs_extent_map_shrinker_remove_em,
>                 __entry->root_id        = inode->root->root_key.objectid;
>                 __entry->start          = em->start;
>                 __entry->len            = em->len;
> -               __entry->block_start    = em->block_start;
>                 __entry->flags          = em->flags;
>         ),
>
> -       TP_printk_btrfs(
> -"ino=%llu root=%llu(%s) start=%llu len=%llu block_start=%llu(%s) flags=%s",
> +       TP_printk_btrfs("ino=%llu root=%llu(%s) start=%llu len=%llu flags=%s",
>                         __entry->ino, show_root_type(__entry->root_id),
>                         __entry->start, __entry->len,
> -                       show_map_type(__entry->block_start),
>                         show_map_flags(__entry->flags))
>  );
>
> --
> 2.45.0
>
>
Qu Wenruo May 16, 2024, 10:45 p.m. UTC | #2
在 2024/5/17 02:58, Filipe Manana 写道:
> On Fri, May 3, 2024 at 7:02 AM Qu Wenruo <wqu@suse.com> wrote:
>>
>> The member extent_map::block_start can be calculated from
>> extent_map::disk_bytenr + extent_map::offset for regular extents.
>> And otherwise just extent_map::disk_bytenr.
>>
>> And this is already validated by the validate_extent_map().
>> Now we can remove the member.
>>
>> However there is a special case in btrfs_alloc_ordered_extent(), where
>> we intentionally pass a pseudo ordered extent, exploiting the fact that
>> for NOCOW/PREALLOC writes we do not rely on ordered extent members to
>> update the file extent items.
>>
>> And that's the only way to pass btrfs_extract_ordered_extent(), as it
>> doesn't accept any ordered extent with an offset.
>>
>> For now we will keep the old pseudo ordered extent members, and leave
>> the cleanup of it for the future.
>
> These last 3 paragraphs, the rant about NOCOW writes and ordered
> extents, seem unnecessary to me.
>
> This is just how things work, and for me it makes total sense that an
> ordered extent for a NOCOW write does not represent the entirety of an
> existing file extent item.
> NOCOW writes don't create new file extent items, so they can refer
> only to a section of an existing extent (or the whole extent).

To me, NOCOW/PREALLOC is really the exception, not following all the
existing definition for all the OE/extent map definitions, even it's
only for transient NOCOW/PREALLOC OE.

And I really hope to remove the exception in the near future, even it
may mean some more complex OE spliting etc.

>
> I don't see how this rant is relevant to have here, as the patchset is
> about extent maps and not ordered extents.
> I would leave it out, as it's a separate thing and doesn't affect anything here.

Sure, I can leave it out for now.

>
> More comments inlined below.
>
>>
[...]
>>
>>          if (type != BTRFS_ORDERED_NOCOW) {
>> -               em = create_io_em(inode, start, len, block_start,
>> +               em = create_io_em(inode, start, len,
>>                                    orig_block_len, ram_bytes,
>>                                    BTRFS_COMPRESS_NONE, /* compress_type */
>>                                    file_extent, type);
>>                  if (IS_ERR(em))
>>                          goto out;
>>          }
>> +
>> +       /*
>> +        * NOTE: I know the numbers are totally wrong for NOCOW/PREALLOC,
>> +        * but it doesn't cause problem at least for now.
>
> They are not wrong, they are what they must be.
>
> This is all about passing the right values to
> btrfs_alloc_ordered_extent(), which has nothing to do with extent
> maps.

I think it's pretty obvious that, only for NOCOW/PREALLOC that OE
members differs from their corresponding extent map.

Sure, it is not causing anything wrong (in fact, anything other than the
current behavior is going to cause a lot of problems).

But just for the sake of consistency, even it doesn't affect any on-disk
change, I still want to modify the call sites so that we can directly
pass the btrfs_file_extent item to OE allocation.
Even if it means other modification mostly inside OE splitting part.

For now I can remove/modify the comments, but I do not think this is
consistent.

>
>> +        *
>> +        * For regular writes, we would have file_extent->offset as 0,
>> +        * thus we really only need disk_bytenr, every other length
>> +        * (disk_num_bytes/ram_bytes) would match @len and fe->num_bytes.
>> +        * The current numbers are totally fine.
>> +        *
>> +        * For NOCOW, we don't really care about the numbers except @file_pos
>
> I don't see any variable named @file_pos anywhere in this function.
>
>> +        * and @num_bytes, as we won't insert a file extent item at all.
>
> There's no @num_bytes either, there's a @len however.
>
>> +        *
>> +        * For PREALLOC, we do not use ordered extent's member, but
>
> ordered extent's member -> ordered extent members
>
>> +        * btrfs_mark_extent_written() would handle everything.
>
> would handle -> handles
>
>> +        *
>> +        * So here we intentionally go with pseudo numbers for the NOCOW/PREALLOC
>> +        * OEs, or btrfs_extract_ordered_extent() would need a completely new
>> +        * routine to handle NOCOW/PREALLOC splits, meanwhile result nothing
>> +        * different.
>> +        */
>
> I would just leave the entire comment out.
>
>>          ordered = btrfs_alloc_ordered_extent(inode, start, len, len,
>> -                                            block_start, len, 0,
[...]
>> @@ -1778,7 +1778,9 @@ static void btrfs_rewrite_logical_zoned(struct btrfs_ordered_extent *ordered,
>>          write_lock(&em_tree->lock);
>>          em = search_extent_mapping(em_tree, ordered->file_offset,
>>                                     ordered->num_bytes);
>> -       em->block_start = logical;
>> +       /* The em should be a new COW extent, thus it should not has offset. */
>
> not has offset -> not have an offset
>
> Otherwise it seems fine, but I still want to go over the rest of the patchset.
> I'm going slowly over it, and after commenting on each inidividual
> patch, I'll comment on the cover letter.

Really appreciate the review so far.
And considering the patchset is not urgent, just take your time so that
I can also address the comments at the same time.

Thanks,
Qu
>
> Thanks.
>
>> +       ASSERT(em->offset == 0);
>> +       em->disk_bytenr = logical;
>>          free_extent_map(em);
>>          write_unlock(&em_tree->lock);
>>   }
>> diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h
>> index 3743719d13f2..89b2b66e5bc0 100644
>> --- a/include/trace/events/btrfs.h
>> +++ b/include/trace/events/btrfs.h
>> @@ -291,7 +291,6 @@ TRACE_EVENT_CONDITION(btrfs_get_extent,
>>                  __field(        u64,  ino               )
>>                  __field(        u64,  start             )
>>                  __field(        u64,  len               )
>> -               __field(        u64,  block_start       )
>>                  __field(        u32,  flags             )
>>                  __field(        int,  refs              )
>>          ),
>> @@ -301,18 +300,16 @@ TRACE_EVENT_CONDITION(btrfs_get_extent,
>>                  __entry->ino            = btrfs_ino(inode);
>>                  __entry->start          = map->start;
>>                  __entry->len            = map->len;
>> -               __entry->block_start    = map->block_start;
>>                  __entry->flags          = map->flags;
>>                  __entry->refs           = refcount_read(&map->refs);
>>          ),
>>
>>          TP_printk_btrfs("root=%llu(%s) ino=%llu start=%llu len=%llu "
>> -                 "block_start=%llu(%s) flags=%s refs=%u",
>> +                 "flags=%s refs=%u",
>>                    show_root_type(__entry->root_objectid),
>>                    __entry->ino,
>>                    __entry->start,
>>                    __entry->len,
>> -                 show_map_type(__entry->block_start),
>>                    show_map_flags(__entry->flags),
>>                    __entry->refs)
>>   );
>> @@ -2608,7 +2605,6 @@ TRACE_EVENT(btrfs_extent_map_shrinker_remove_em,
>>                  __field(        u64,    root_id         )
>>                  __field(        u64,    start           )
>>                  __field(        u64,    len             )
>> -               __field(        u64,    block_start     )
>>                  __field(        u32,    flags           )
>>          ),
>>
>> @@ -2617,15 +2613,12 @@ TRACE_EVENT(btrfs_extent_map_shrinker_remove_em,
>>                  __entry->root_id        = inode->root->root_key.objectid;
>>                  __entry->start          = em->start;
>>                  __entry->len            = em->len;
>> -               __entry->block_start    = em->block_start;
>>                  __entry->flags          = em->flags;
>>          ),
>>
>> -       TP_printk_btrfs(
>> -"ino=%llu root=%llu(%s) start=%llu len=%llu block_start=%llu(%s) flags=%s",
>> +       TP_printk_btrfs("ino=%llu root=%llu(%s) start=%llu len=%llu flags=%s",
>>                          __entry->ino, show_root_type(__entry->root_id),
>>                          __entry->start, __entry->len,
>> -                       show_map_type(__entry->block_start),
>>                          show_map_flags(__entry->flags))
>>   );
>>
>> --
>> 2.45.0
>>
>>
>
diff mbox series

Patch

diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 3af87911c83e..414adbba07b8 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -507,7 +507,8 @@  static noinline int add_ra_bio_pages(struct inode *inode,
 		 */
 		if (!em || cur < em->start ||
 		    (cur + fs_info->sectorsize > extent_map_end(em)) ||
-		    (em->block_start >> SECTOR_SHIFT) != orig_bio->bi_iter.bi_sector) {
+		    (extent_map_block_start(em) >> SECTOR_SHIFT) !=
+		    orig_bio->bi_iter.bi_sector) {
 			free_extent_map(em);
 			unlock_extent(tree, cur, page_end, NULL);
 			unlock_page(page);
diff --git a/fs/btrfs/defrag.c b/fs/btrfs/defrag.c
index 025e7f853a68..6fb94e897fc5 100644
--- a/fs/btrfs/defrag.c
+++ b/fs/btrfs/defrag.c
@@ -707,7 +707,6 @@  static struct extent_map *defrag_get_extent(struct btrfs_inode *inode,
 		 */
 		if (key.offset > start) {
 			em->start = start;
-			em->block_start = EXTENT_MAP_HOLE;
 			em->disk_bytenr = EXTENT_MAP_HOLE;
 			em->disk_num_bytes = 0;
 			em->ram_bytes = 0;
@@ -828,7 +827,7 @@  static bool defrag_check_next_extent(struct inode *inode, struct extent_map *em,
 	 */
 	next = defrag_lookup_extent(inode, em->start + em->len, newer_than, locked);
 	/* No more em or hole */
-	if (!next || next->block_start >= EXTENT_MAP_LAST_BYTE)
+	if (!next || next->disk_bytenr >= EXTENT_MAP_LAST_BYTE)
 		goto out;
 	if (next->flags & EXTENT_FLAG_PREALLOC)
 		goto out;
@@ -995,12 +994,12 @@  static int defrag_collect_targets(struct btrfs_inode *inode,
 		 * This is for users who want to convert inline extents to
 		 * regular ones through max_inline= mount option.
 		 */
-		if (em->block_start == EXTENT_MAP_INLINE &&
+		if (em->disk_bytenr == EXTENT_MAP_INLINE &&
 		    em->len <= inode->root->fs_info->max_inline)
 			goto next;
 
 		/* Skip holes and preallocated extents. */
-		if (em->block_start == EXTENT_MAP_HOLE ||
+		if (em->disk_bytenr == EXTENT_MAP_HOLE ||
 		    (em->flags & EXTENT_FLAG_PREALLOC))
 			goto next;
 
@@ -1065,7 +1064,7 @@  static int defrag_collect_targets(struct btrfs_inode *inode,
 		 * So if an inline extent passed all above checks, just add it
 		 * for defrag, and be converted to regular extents.
 		 */
-		if (em->block_start == EXTENT_MAP_INLINE)
+		if (em->disk_bytenr == EXTENT_MAP_INLINE)
 			goto add;
 
 		next_mergeable = defrag_check_next_extent(&inode->vfs_inode, em,
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 597387e9f040..ef9928cc6467 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -1083,10 +1083,10 @@  static int btrfs_do_readpage(struct page *page, struct extent_map **em_cached,
 		iosize = min(extent_map_end(em) - cur, end - cur + 1);
 		iosize = ALIGN(iosize, blocksize);
 		if (compress_type != BTRFS_COMPRESS_NONE)
-			disk_bytenr = em->block_start;
+			disk_bytenr = em->disk_bytenr;
 		else
-			disk_bytenr = em->block_start + extent_offset;
-		block_start = em->block_start;
+			disk_bytenr = extent_map_block_start(em) + extent_offset;
+		block_start = extent_map_block_start(em);
 		if (em->flags & EXTENT_FLAG_PREALLOC)
 			block_start = EXTENT_MAP_HOLE;
 
@@ -1405,8 +1405,8 @@  static noinline_for_stack int __extent_writepage_io(struct btrfs_inode *inode,
 		ASSERT(IS_ALIGNED(em->start, fs_info->sectorsize));
 		ASSERT(IS_ALIGNED(em->len, fs_info->sectorsize));
 
-		block_start = em->block_start;
-		disk_bytenr = em->block_start + extent_offset;
+		block_start = extent_map_block_start(em);
+		disk_bytenr = extent_map_block_start(em) + extent_offset;
 
 		ASSERT(!extent_map_is_compressed(em));
 		ASSERT(block_start != EXTENT_MAP_HOLE);
diff --git a/fs/btrfs/extent_map.c b/fs/btrfs/extent_map.c
index dcd191c2c4b3..9ae86125599a 100644
--- a/fs/btrfs/extent_map.c
+++ b/fs/btrfs/extent_map.c
@@ -195,9 +195,10 @@  static inline u64 extent_map_block_len(const struct extent_map *em)
 
 static inline u64 extent_map_block_end(const struct extent_map *em)
 {
-	if (em->block_start + extent_map_block_len(em) < em->block_start)
+	if (extent_map_block_start(em) + extent_map_block_len(em) <
+	    extent_map_block_start(em))
 		return (u64)-1;
-	return em->block_start + extent_map_block_len(em);
+	return extent_map_block_start(em) + extent_map_block_len(em);
 }
 
 static bool can_merge_extent_map(const struct extent_map *em)
@@ -232,11 +233,11 @@  static bool mergeable_maps(const struct extent_map *prev, const struct extent_ma
 	if (prev->flags != next->flags)
 		return false;
 
-	if (next->block_start < EXTENT_MAP_LAST_BYTE - 1)
-		return next->block_start == extent_map_block_end(prev);
+	if (next->disk_bytenr < EXTENT_MAP_LAST_BYTE - 1)
+		return extent_map_block_start(next) == extent_map_block_end(prev);
 
 	/* HOLES and INLINE extents. */
-	return next->block_start == prev->block_start;
+	return next->disk_bytenr == prev->disk_bytenr;
 }
 
 /*
@@ -295,10 +296,9 @@  static void dump_extent_map(const char *prefix, struct extent_map *em)
 {
 	if (!IS_ENABLED(CONFIG_BTRFS_DEBUG))
 		return;
-	pr_crit("%s, start=%llu len=%llu disk_bytenr=%llu disk_num_bytes=%llu ram_bytes=%llu offset=%llu block_start=%llu flags=0x%x\n",
+	pr_crit("%s, start=%llu len=%llu disk_bytenr=%llu disk_num_bytes=%llu ram_bytes=%llu offset=%llu flags=0x%x\n",
 		prefix, em->start, em->len, em->disk_bytenr, em->disk_num_bytes,
-		em->ram_bytes, em->offset, em->block_start,
-		em->flags);
+		em->ram_bytes, em->offset, em->flags);
 	ASSERT(0);
 }
 
@@ -315,16 +315,6 @@  static void validate_extent_map(struct extent_map *em)
 		if (em->offset + em->len > em->disk_num_bytes &&
 		    !extent_map_is_compressed(em))
 			dump_extent_map("disk_num_bytes too small", em);
-
-		if (extent_map_is_compressed(em)) {
-			if (em->block_start != em->disk_bytenr)
-				dump_extent_map(
-				"mismatch block_start/disk_bytenr/offset", em);
-		} else {
-			if (em->block_start != em->disk_bytenr + em->offset)
-				dump_extent_map(
-				"mismatch block_start/disk_bytenr/offset", em);
-		}
 	} else {
 		if (em->offset)
 			dump_extent_map("non-zero offset for hole/inline", em);
@@ -358,7 +348,6 @@  static void try_merge_map(struct btrfs_inode *inode, struct extent_map *em)
 		if (rb && can_merge_extent_map(merge) && mergeable_maps(merge, em)) {
 			em->start = merge->start;
 			em->len += merge->len;
-			em->block_start = merge->block_start;
 			em->generation = max(em->generation, merge->generation);
 
 			if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE)
@@ -668,11 +657,9 @@  static noinline int merge_extent_mapping(struct btrfs_inode *inode,
 	start_diff = start - em->start;
 	em->start = start;
 	em->len = end - start;
-	if (em->block_start < EXTENT_MAP_LAST_BYTE &&
-	    !extent_map_is_compressed(em)) {
-		em->block_start += start_diff;
+	if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE &&
+	    !extent_map_is_compressed(em))
 		em->offset += start_diff;
-	}
 	return add_extent_mapping(inode, em, 0);
 }
 
@@ -707,7 +694,7 @@  int btrfs_add_extent_mapping(struct btrfs_inode *inode,
 	 * Tree-checker should have rejected any inline extent with non-zero
 	 * file offset. Here just do a sanity check.
 	 */
-	if (em->block_start == EXTENT_MAP_INLINE)
+	if (em->disk_bytenr == EXTENT_MAP_INLINE)
 		ASSERT(em->start == 0);
 
 	ret = add_extent_mapping(inode, em, 0);
@@ -836,7 +823,6 @@  void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
 		u64 gen;
 		unsigned long flags;
 		bool modified;
-		bool compressed;
 
 		if (em_end < end) {
 			next_em = next_extent_map(em);
@@ -870,7 +856,6 @@  void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
 			goto remove_em;
 
 		gen = em->generation;
-		compressed = extent_map_is_compressed(em);
 
 		if (em->start < start) {
 			if (!split) {
@@ -882,15 +867,12 @@  void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
 			split->start = em->start;
 			split->len = start - em->start;
 
-			if (em->block_start < EXTENT_MAP_LAST_BYTE) {
-				split->block_start = em->block_start;
-
+			if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) {
 				split->disk_bytenr = em->disk_bytenr;
 				split->disk_num_bytes = em->disk_num_bytes;
 				split->offset = em->offset;
 				split->ram_bytes = em->ram_bytes;
 			} else {
-				split->block_start = em->block_start;
 				split->disk_bytenr = em->disk_bytenr;
 				split->disk_num_bytes = 0;
 				split->offset = 0;
@@ -913,20 +895,14 @@  void btrfs_drop_extent_map_range(struct btrfs_inode *inode, u64 start, u64 end,
 			}
 			split->start = end;
 			split->len = em_end - end;
-			split->block_start = em->block_start;
 			split->disk_bytenr = em->disk_bytenr;
 			split->flags = flags;
 			split->generation = gen;
 
-			if (em->block_start < EXTENT_MAP_LAST_BYTE) {
+			if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) {
 				split->disk_num_bytes = em->disk_num_bytes;
 				split->offset = em->offset + end - em->start;
 				split->ram_bytes = em->ram_bytes;
-				if (!compressed) {
-					const u64 diff = end - em->start;
-
-					split->block_start += diff;
-				}
 			} else {
 				split->disk_num_bytes = 0;
 				split->offset = 0;
@@ -1073,7 +1049,7 @@  int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
 
 	ASSERT(em->len == len);
 	ASSERT(!extent_map_is_compressed(em));
-	ASSERT(em->block_start < EXTENT_MAP_LAST_BYTE);
+	ASSERT(em->disk_bytenr < EXTENT_MAP_LAST_BYTE);
 	ASSERT(em->flags & EXTENT_FLAG_PINNED);
 	ASSERT(!(em->flags & EXTENT_FLAG_LOGGING));
 	ASSERT(!list_empty(&em->list));
@@ -1087,7 +1063,6 @@  int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
 	split_pre->disk_bytenr = new_logical;
 	split_pre->disk_num_bytes = split_pre->len;
 	split_pre->offset = 0;
-	split_pre->block_start = new_logical;
 	split_pre->ram_bytes = split_pre->len;
 	split_pre->flags = flags;
 	split_pre->generation = em->generation;
@@ -1102,10 +1077,9 @@  int split_extent_map(struct btrfs_inode *inode, u64 start, u64 len, u64 pre,
 	/* Insert the middle extent_map. */
 	split_mid->start = em->start + pre;
 	split_mid->len = em->len - pre;
-	split_mid->disk_bytenr = em->block_start + pre;
+	split_mid->disk_bytenr = extent_map_block_start(em) + pre;
 	split_mid->disk_num_bytes = split_mid->len;
 	split_mid->offset = 0;
-	split_mid->block_start = em->block_start + pre;
 	split_mid->ram_bytes = split_mid->len;
 	split_mid->flags = flags;
 	split_mid->generation = em->generation;
diff --git a/fs/btrfs/extent_map.h b/fs/btrfs/extent_map.h
index aee721eaa7f3..a0e7f49ec88f 100644
--- a/fs/btrfs/extent_map.h
+++ b/fs/btrfs/extent_map.h
@@ -90,18 +90,6 @@  struct extent_map {
 	 */
 	u64 ram_bytes;
 
-	/*
-	 * The on-disk logical bytenr for the file extent.
-	 *
-	 * For compressed extents it matches btrfs_file_extent_item::disk_bytenr.
-	 * For uncompressed extents it matches
-	 * btrfs_file_extent_item::disk_bytenr + btrfs_file_extent_item::offset
-	 *
-	 * For holes it is EXTENT_MAP_HOLE and for inline extents it is
-	 * EXTENT_MAP_INLINE.
-	 */
-	u64 block_start;
-
 	/*
 	 * Generation of the extent map, for merged em it's the highest
 	 * generation of all merged ems.
@@ -162,6 +150,16 @@  static inline int extent_map_in_tree(const struct extent_map *em)
 	return !RB_EMPTY_NODE(&em->rb_node);
 }
 
+static inline u64 extent_map_block_start(const struct extent_map *em)
+{
+	if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) {
+		if (extent_map_is_compressed(em))
+			return em->disk_bytenr;
+		return em->disk_bytenr + em->offset;
+	}
+	return em->disk_bytenr;
+}
+
 static inline u64 extent_map_end(const struct extent_map *em)
 {
 	if (em->start + em->len < em->start)
diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c
index 95fb7c059a1a..b8e213a1a8ee 100644
--- a/fs/btrfs/file-item.c
+++ b/fs/btrfs/file-item.c
@@ -1294,7 +1294,6 @@  void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode,
 		em->len = btrfs_file_extent_end(path) - extent_start;
 		bytenr = btrfs_file_extent_disk_bytenr(leaf, fi);
 		if (bytenr == 0) {
-			em->block_start = EXTENT_MAP_HOLE;
 			em->disk_bytenr = EXTENT_MAP_HOLE;
 			em->disk_num_bytes = 0;
 			em->offset = 0;
@@ -1305,10 +1304,8 @@  void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode,
 		em->offset = btrfs_file_extent_offset(leaf, fi);
 		if (compress_type != BTRFS_COMPRESS_NONE) {
 			extent_map_set_compression(em, compress_type);
-			em->block_start = bytenr;
 		} else {
 			bytenr += btrfs_file_extent_offset(leaf, fi);
-			em->block_start = bytenr;
 			if (type == BTRFS_FILE_EXTENT_PREALLOC)
 				em->flags |= EXTENT_FLAG_PREALLOC;
 		}
@@ -1316,7 +1313,6 @@  void btrfs_extent_item_to_extent_map(struct btrfs_inode *inode,
 		/* Tree-checker has ensured this. */
 		ASSERT(extent_start == 0);
 
-		em->block_start = EXTENT_MAP_INLINE;
 		em->disk_bytenr = EXTENT_MAP_INLINE;
 		em->start = 0;
 		em->len = fs_info->sectorsize;
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 05c7b5429b85..102b5c17ece1 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -2335,7 +2335,6 @@  static int fill_holes(struct btrfs_trans_handle *trans,
 		hole_em->len = end - offset;
 		hole_em->ram_bytes = hole_em->len;
 
-		hole_em->block_start = EXTENT_MAP_HOLE;
 		hole_em->disk_bytenr = EXTENT_MAP_HOLE;
 		hole_em->disk_num_bytes = 0;
 		hole_em->generation = trans->transid;
@@ -2368,7 +2367,7 @@  static int find_first_non_hole(struct btrfs_inode *inode, u64 *start, u64 *len)
 		return PTR_ERR(em);
 
 	/* Hole or vacuum extent(only exists in no-hole mode) */
-	if (em->block_start == EXTENT_MAP_HOLE) {
+	if (em->disk_bytenr == EXTENT_MAP_HOLE) {
 		ret = 1;
 		*len = em->start + em->len > *start + *len ?
 		       0 : *start + *len - em->start - em->len;
@@ -3025,7 +3024,7 @@  static int btrfs_zero_range_check_range_boundary(struct btrfs_inode *inode,
 	if (IS_ERR(em))
 		return PTR_ERR(em);
 
-	if (em->block_start == EXTENT_MAP_HOLE)
+	if (em->disk_bytenr == EXTENT_MAP_HOLE)
 		ret = RANGE_BOUNDARY_HOLE;
 	else if (em->flags & EXTENT_FLAG_PREALLOC)
 		ret = RANGE_BOUNDARY_PREALLOC_EXTENT;
@@ -3089,7 +3088,7 @@  static int btrfs_zero_range(struct inode *inode,
 		ASSERT(IS_ALIGNED(alloc_start, sectorsize));
 		len = offset + len - alloc_start;
 		offset = alloc_start;
-		alloc_hint = em->block_start + em->len;
+		alloc_hint = extent_map_block_start(em) + em->len;
 	}
 	free_extent_map(em);
 
@@ -3107,7 +3106,7 @@  static int btrfs_zero_range(struct inode *inode,
 							   mode);
 			goto out;
 		}
-		if (len < sectorsize && em->block_start != EXTENT_MAP_HOLE) {
+		if (len < sectorsize && em->disk_bytenr != EXTENT_MAP_HOLE) {
 			free_extent_map(em);
 			ret = btrfs_truncate_block(BTRFS_I(inode), offset, len,
 						   0);
@@ -3320,7 +3319,7 @@  static long btrfs_fallocate(struct file *file, int mode,
 		last_byte = min(extent_map_end(em), alloc_end);
 		actual_end = min_t(u64, extent_map_end(em), offset + len);
 		last_byte = ALIGN(last_byte, blocksize);
-		if (em->block_start == EXTENT_MAP_HOLE ||
+		if (em->disk_bytenr == EXTENT_MAP_HOLE ||
 		    (cur_offset >= inode->i_size &&
 		     !(em->flags & EXTENT_FLAG_PREALLOC))) {
 			const u64 range_len = last_byte - cur_offset;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 7df295e0046d..8bc1f165193a 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -138,7 +138,7 @@  static noinline int run_delalloc_cow(struct btrfs_inode *inode,
 				     u64 end, struct writeback_control *wbc,
 				     bool pages_dirty);
 static struct extent_map *create_io_em(struct btrfs_inode *inode, u64 start,
-				       u64 len, u64 block_start,
+				       u64 len,
 				       u64 disk_num_bytes,
 				       u64 ram_bytes, int compress_type,
 				       struct btrfs_file_extent *file_extent,
@@ -1209,7 +1209,6 @@  static void submit_one_async_extent(struct async_chunk *async_chunk,
 
 	em = create_io_em(inode, start,
 			  async_extent->ram_size,	/* len */
-			  ins.objectid,			/* block_start */
 			  ins.offset,			/* orig_block_len */
 			  async_extent->ram_size,	/* ram_bytes */
 			  async_extent->compress_type,
@@ -1287,15 +1286,15 @@  static u64 get_extent_allocation_hint(struct btrfs_inode *inode, u64 start,
 		 * first block in this inode and use that as a hint.  If that
 		 * block is also bogus then just don't worry about it.
 		 */
-		if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
+		if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
 			free_extent_map(em);
 			em = search_extent_mapping(em_tree, 0, 0);
-			if (em && em->block_start < EXTENT_MAP_LAST_BYTE)
-				alloc_hint = em->block_start;
+			if (em && em->disk_bytenr < EXTENT_MAP_LAST_BYTE)
+				alloc_hint = extent_map_block_start(em);
 			if (em)
 				free_extent_map(em);
 		} else {
-			alloc_hint = em->block_start;
+			alloc_hint = extent_map_block_start(em);
 			free_extent_map(em);
 		}
 	}
@@ -1451,7 +1450,6 @@  static noinline int cow_file_range(struct btrfs_inode *inode,
 			    &cached);
 
 		em = create_io_em(inode, start, ins.offset, /* len */
-				  ins.objectid, /* block_start */
 				  ins.offset, /* orig_block_len */
 				  ram_size, /* ram_bytes */
 				  BTRFS_COMPRESS_NONE, /* compress_type */
@@ -2191,7 +2189,6 @@  static noinline int run_delalloc_nocow(struct btrfs_inode *inode,
 			struct extent_map *em;
 
 			em = create_io_em(inode, cur_offset, nocow_args.num_bytes,
-					  nocow_args.disk_bytenr, /* block_start */
 					  nocow_args.disk_num_bytes, /* orig_block_len */
 					  ram_bytes, BTRFS_COMPRESS_NONE,
 					  &nocow_args.file_extent,
@@ -2706,7 +2703,7 @@  static int btrfs_find_new_delalloc_bytes(struct btrfs_inode *inode,
 		if (IS_ERR(em))
 			return PTR_ERR(em);
 
-		if (em->block_start != EXTENT_MAP_HOLE)
+		if (extent_map_block_start(em) != EXTENT_MAP_HOLE)
 			goto next;
 
 		em_len = em->len;
@@ -4993,7 +4990,6 @@  int btrfs_cont_expand(struct btrfs_inode *inode, loff_t oldsize, loff_t size)
 			hole_em->start = cur_offset;
 			hole_em->len = hole_size;
 
-			hole_em->block_start = EXTENT_MAP_HOLE;
 			hole_em->disk_bytenr = EXTENT_MAP_HOLE;
 			hole_em->disk_num_bytes = 0;
 			hole_em->ram_bytes = hole_size;
@@ -6842,7 +6838,7 @@  struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
 	if (em) {
 		if (em->start > start || em->start + em->len <= start)
 			free_extent_map(em);
-		else if (em->block_start == EXTENT_MAP_INLINE && page)
+		else if (em->disk_bytenr == EXTENT_MAP_INLINE && page)
 			free_extent_map(em);
 		else
 			goto out;
@@ -6945,7 +6941,7 @@  struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
 		/* New extent overlaps with existing one */
 		em->start = start;
 		em->len = found_key.offset - start;
-		em->block_start = EXTENT_MAP_HOLE;
+		em->disk_bytenr = EXTENT_MAP_HOLE;
 		goto insert;
 	}
 
@@ -6969,7 +6965,7 @@  struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
 		 *
 		 * Other members are not utilized for inline extents.
 		 */
-		ASSERT(em->block_start == EXTENT_MAP_INLINE);
+		ASSERT(em->disk_bytenr == EXTENT_MAP_INLINE);
 		ASSERT(em->len == fs_info->sectorsize);
 
 		ret = read_inline_extent(inode, path, page);
@@ -6980,7 +6976,7 @@  struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
 not_found:
 	em->start = start;
 	em->len = len;
-	em->block_start = EXTENT_MAP_HOLE;
+	em->disk_bytenr = EXTENT_MAP_HOLE;
 insert:
 	ret = 0;
 	btrfs_release_path(path);
@@ -7011,7 +7007,6 @@  static struct extent_map *btrfs_create_dio_extent(struct btrfs_inode *inode,
 						  struct btrfs_dio_data *dio_data,
 						  const u64 start,
 						  const u64 len,
-						  const u64 block_start,
 						  const u64 orig_block_len,
 						  const u64 ram_bytes,
 						  const int type,
@@ -7021,15 +7016,38 @@  static struct extent_map *btrfs_create_dio_extent(struct btrfs_inode *inode,
 	struct btrfs_ordered_extent *ordered;
 
 	if (type != BTRFS_ORDERED_NOCOW) {
-		em = create_io_em(inode, start, len, block_start,
+		em = create_io_em(inode, start, len,
 				  orig_block_len, ram_bytes,
 				  BTRFS_COMPRESS_NONE, /* compress_type */
 				  file_extent, type);
 		if (IS_ERR(em))
 			goto out;
 	}
+
+	/*
+	 * NOTE: I know the numbers are totally wrong for NOCOW/PREALLOC,
+	 * but it doesn't cause problem at least for now.
+	 *
+	 * For regular writes, we would have file_extent->offset as 0,
+	 * thus we really only need disk_bytenr, every other length
+	 * (disk_num_bytes/ram_bytes) would match @len and fe->num_bytes.
+	 * The current numbers are totally fine.
+	 *
+	 * For NOCOW, we don't really care about the numbers except @file_pos
+	 * and @num_bytes, as we won't insert a file extent item at all.
+	 *
+	 * For PREALLOC, we do not use ordered extent's member, but
+	 * btrfs_mark_extent_written() would handle everything.
+	 *
+	 * So here we intentionally go with pseudo numbers for the NOCOW/PREALLOC
+	 * OEs, or btrfs_extract_ordered_extent() would need a completely new
+	 * routine to handle NOCOW/PREALLOC splits, meanwhile result nothing
+	 * different.
+	 */
 	ordered = btrfs_alloc_ordered_extent(inode, start, len, len,
-					     block_start, len, 0,
+					     file_extent->disk_bytenr +
+					     file_extent->offset,
+					     len, 0,
 					     (1 << type) |
 					     (1 << BTRFS_ORDERED_DIRECT),
 					     BTRFS_COMPRESS_NONE);
@@ -7081,7 +7099,7 @@  static struct extent_map *btrfs_new_extent_direct(struct btrfs_inode *inode,
 	file_extent.offset = 0;
 	file_extent.compression = BTRFS_COMPRESS_NONE;
 	em = btrfs_create_dio_extent(inode, dio_data, start, ins.offset,
-				     ins.objectid, ins.offset,
+				     ins.offset,
 				     ins.offset, BTRFS_ORDERED_REGULAR,
 				     &file_extent);
 	btrfs_dec_block_group_reservations(fs_info, ins.objectid);
@@ -7321,7 +7339,7 @@  static int lock_extent_direct(struct inode *inode, u64 lockstart, u64 lockend,
 
 /* The callers of this must take lock_extent() */
 static struct extent_map *create_io_em(struct btrfs_inode *inode, u64 start,
-				       u64 len, u64 block_start,
+				       u64 len,
 				       u64 disk_num_bytes,
 				       u64 ram_bytes, int compress_type,
 				       struct btrfs_file_extent *file_extent,
@@ -7373,7 +7391,6 @@  static struct extent_map *create_io_em(struct btrfs_inode *inode, u64 start,
 
 	em->start = start;
 	em->len = len;
-	em->block_start = block_start;
 	em->disk_bytenr = file_extent->disk_bytenr;
 	em->disk_num_bytes = disk_num_bytes;
 	em->ram_bytes = ram_bytes;
@@ -7424,13 +7441,13 @@  static int btrfs_get_blocks_direct_write(struct extent_map **map,
 	 */
 	if ((em->flags & EXTENT_FLAG_PREALLOC) ||
 	    ((BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW) &&
-	     em->block_start != EXTENT_MAP_HOLE)) {
+	     em->disk_bytenr != EXTENT_MAP_HOLE)) {
 		if (em->flags & EXTENT_FLAG_PREALLOC)
 			type = BTRFS_ORDERED_PREALLOC;
 		else
 			type = BTRFS_ORDERED_NOCOW;
 		len = min(len, em->len - (start - em->start));
-		block_start = em->block_start + (start - em->start);
+		block_start = extent_map_block_start(em) + (start - em->start);
 
 		if (can_nocow_extent(inode, start, &len,
 				     &orig_block_len, &ram_bytes,
@@ -7460,7 +7477,6 @@  static int btrfs_get_blocks_direct_write(struct extent_map **map,
 		space_reserved = true;
 
 		em2 = btrfs_create_dio_extent(BTRFS_I(inode), dio_data, start, len,
-					      block_start,
 					      orig_block_len,
 					      ram_bytes, type,
 					      &file_extent);
@@ -7663,7 +7679,7 @@  static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
 	 * the generic code.
 	 */
 	if (extent_map_is_compressed(em) ||
-	    em->block_start == EXTENT_MAP_INLINE) {
+	    em->disk_bytenr == EXTENT_MAP_INLINE) {
 		free_extent_map(em);
 		/*
 		 * If we are in a NOWAIT context, return -EAGAIN in order to
@@ -7757,12 +7773,12 @@  static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
 	 * We trim the extents (and move the addr) even though iomap code does
 	 * that, since we have locked only the parts we are performing I/O in.
 	 */
-	if ((em->block_start == EXTENT_MAP_HOLE) ||
+	if ((em->disk_bytenr == EXTENT_MAP_HOLE) ||
 	    ((em->flags & EXTENT_FLAG_PREALLOC) && !write)) {
 		iomap->addr = IOMAP_NULL_ADDR;
 		iomap->type = IOMAP_HOLE;
 	} else {
-		iomap->addr = em->block_start + (start - em->start);
+		iomap->addr = extent_map_block_start(em) + (start - em->start);
 		iomap->type = IOMAP_MAPPED;
 	}
 	iomap->offset = start;
@@ -9612,7 +9628,6 @@  static int __btrfs_prealloc_file_range(struct inode *inode, int mode,
 
 		em->start = cur_offset;
 		em->len = ins.offset;
-		em->block_start = ins.objectid;
 		em->disk_bytenr = ins.objectid;
 		em->offset = 0;
 		em->disk_num_bytes = ins.offset;
@@ -10078,7 +10093,7 @@  ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
 		goto out_unlock_extent;
 	}
 
-	if (em->block_start == EXTENT_MAP_INLINE) {
+	if (em->disk_bytenr == EXTENT_MAP_INLINE) {
 		u64 extent_start = em->start;
 
 		/*
@@ -10099,14 +10114,14 @@  ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
 	 */
 	encoded->len = min_t(u64, extent_map_end(em),
 			     inode->vfs_inode.i_size) - iocb->ki_pos;
-	if (em->block_start == EXTENT_MAP_HOLE ||
+	if (em->disk_bytenr == EXTENT_MAP_HOLE ||
 	    (em->flags & EXTENT_FLAG_PREALLOC)) {
 		disk_bytenr = EXTENT_MAP_HOLE;
 		count = min_t(u64, count, encoded->len);
 		encoded->len = count;
 		encoded->unencoded_len = count;
 	} else if (extent_map_is_compressed(em)) {
-		disk_bytenr = em->block_start;
+		disk_bytenr = em->disk_bytenr;
 		/*
 		 * Bail if the buffer isn't large enough to return the whole
 		 * compressed extent.
@@ -10125,7 +10140,7 @@  ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
 			goto out_em;
 		encoded->compression = ret;
 	} else {
-		disk_bytenr = em->block_start + (start - em->start);
+		disk_bytenr = extent_map_block_start(em) + (start - em->start);
 		if (encoded->len > count)
 			encoded->len = count;
 		/*
@@ -10363,7 +10378,6 @@  ssize_t btrfs_do_encoded_write(struct kiocb *iocb, struct iov_iter *from,
 	file_extent.offset = encoded->unencoded_offset;
 	file_extent.compression = compression;
 	em = create_io_em(inode, start, num_bytes,
-			  ins.objectid,
 			  ins.offset, ram_bytes, compression,
 			  &file_extent, BTRFS_ORDERED_COMPRESSED);
 	if (IS_ERR(em)) {
@@ -10667,12 +10681,12 @@  static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
 			goto out;
 		}
 
-		if (em->block_start == EXTENT_MAP_HOLE) {
+		if (em->disk_bytenr == EXTENT_MAP_HOLE) {
 			btrfs_warn(fs_info, "swapfile must not have holes");
 			ret = -EINVAL;
 			goto out;
 		}
-		if (em->block_start == EXTENT_MAP_INLINE) {
+		if (em->disk_bytenr == EXTENT_MAP_INLINE) {
 			/*
 			 * It's unlikely we'll ever actually find ourselves
 			 * here, as a file small enough to fit inline won't be
@@ -10690,7 +10704,7 @@  static int btrfs_swap_activate(struct swap_info_struct *sis, struct file *file,
 			goto out;
 		}
 
-		logical_block_start = em->block_start + (start - em->start);
+		logical_block_start = extent_map_block_start(em) + (start - em->start);
 		len = min(len, em->len - (start - em->start));
 		free_extent_map(em);
 		em = NULL;
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index a66d9b921f84..0d462c2a9c89 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -2912,7 +2912,6 @@  static noinline_for_stack int setup_relocation_extent_mapping(struct inode *inod
 
 	em->start = start;
 	em->len = end + 1 - start;
-	em->block_start = block_start;
 	em->disk_bytenr = block_start;
 	em->disk_num_bytes = em->len;
 	em->ram_bytes = em->len;
diff --git a/fs/btrfs/tests/extent-map-tests.c b/fs/btrfs/tests/extent-map-tests.c
index ffdaa6a682af..a145214be14b 100644
--- a/fs/btrfs/tests/extent-map-tests.c
+++ b/fs/btrfs/tests/extent-map-tests.c
@@ -28,8 +28,8 @@  static int free_extent_map_tree(struct btrfs_inode *inode)
 		if (refcount_read(&em->refs) != 1) {
 			ret = -EINVAL;
 			test_err(
-"em leak: em (start %llu len %llu block_start %llu disk_num_bytes %llu offset %llu) refs %d",
-				 em->start, em->len, em->block_start,
+"em leak: em (start %llu len %llu disk_bytenr %llu disk_num_bytes %llu offset %llu) refs %d",
+				 em->start, em->len, em->disk_bytenr,
 				 em->disk_num_bytes, em->offset,
 				 refcount_read(&em->refs));
 
@@ -77,7 +77,6 @@  static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 	/* Add [0, 16K) */
 	em->start = 0;
 	em->len = SZ_16K;
-	em->block_start = 0;
 	em->disk_bytenr = 0;
 	em->disk_num_bytes = SZ_16K;
 	em->ram_bytes = SZ_16K;
@@ -100,7 +99,6 @@  static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 
 	em->start = SZ_16K;
 	em->len = SZ_4K;
-	em->block_start = SZ_32K; /* avoid merging */
 	em->disk_bytenr = SZ_32K; /* avoid merging */
 	em->disk_num_bytes = SZ_4K;
 	em->ram_bytes = SZ_4K;
@@ -123,7 +121,6 @@  static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 	/* Add [0, 8K), should return [0, 16K) instead. */
 	em->start = start;
 	em->len = len;
-	em->block_start = start;
 	em->disk_bytenr = start;
 	em->disk_num_bytes = len;
 	em->ram_bytes = len;
@@ -141,11 +138,11 @@  static int test_case_1(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 		goto out;
 	}
 	if (em->start != 0 || extent_map_end(em) != SZ_16K ||
-	    em->block_start != 0 || em->disk_num_bytes != SZ_16K) {
+	    em->disk_bytenr != 0 || em->disk_num_bytes != SZ_16K) {
 		test_err(
-"case1 [%llu %llu]: ret %d return a wrong em (start %llu len %llu block_start %llu disk_num_bytes %llu",
+"case1 [%llu %llu]: ret %d return a wrong em (start %llu len %llu disk_bytenr %llu disk_num_bytes %llu",
 			 start, start + len, ret, em->start, em->len,
-			 em->block_start, em->disk_num_bytes);
+			 em->disk_bytenr, em->disk_num_bytes);
 		ret = -EINVAL;
 	}
 	free_extent_map(em);
@@ -179,7 +176,6 @@  static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 	/* Add [0, 1K) */
 	em->start = 0;
 	em->len = SZ_1K;
-	em->block_start = EXTENT_MAP_INLINE;
 	em->disk_bytenr = EXTENT_MAP_INLINE;
 	em->disk_num_bytes = 0;
 	em->ram_bytes = SZ_1K;
@@ -202,7 +198,6 @@  static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 
 	em->start = SZ_4K;
 	em->len = SZ_4K;
-	em->block_start = SZ_4K;
 	em->disk_bytenr = SZ_4K;
 	em->disk_num_bytes = SZ_4K;
 	em->ram_bytes = SZ_4K;
@@ -225,7 +220,6 @@  static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 	/* Add [0, 1K) */
 	em->start = 0;
 	em->len = SZ_1K;
-	em->block_start = EXTENT_MAP_INLINE;
 	em->disk_bytenr = EXTENT_MAP_INLINE;
 	em->disk_num_bytes = 0;
 	em->ram_bytes = SZ_1K;
@@ -242,10 +236,10 @@  static int test_case_2(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 		goto out;
 	}
 	if (em->start != 0 || extent_map_end(em) != SZ_1K ||
-	    em->block_start != EXTENT_MAP_INLINE) {
+	    em->disk_bytenr != EXTENT_MAP_INLINE) {
 		test_err(
-"case2 [0 1K]: ret %d return a wrong em (start %llu len %llu block_start %llu",
-			 ret, em->start, em->len, em->block_start);
+"case2 [0 1K]: ret %d return a wrong em (start %llu len %llu disk_bytenr %llu",
+			 ret, em->start, em->len, em->disk_bytenr);
 		ret = -EINVAL;
 	}
 	free_extent_map(em);
@@ -275,7 +269,6 @@  static int __test_case_3(struct btrfs_fs_info *fs_info,
 	/* Add [4K, 8K) */
 	em->start = SZ_4K;
 	em->len = SZ_4K;
-	em->block_start = SZ_4K;
 	em->disk_bytenr = SZ_4K;
 	em->disk_num_bytes = SZ_4K;
 	em->ram_bytes = SZ_4K;
@@ -298,7 +291,6 @@  static int __test_case_3(struct btrfs_fs_info *fs_info,
 	/* Add [0, 16K) */
 	em->start = 0;
 	em->len = SZ_16K;
-	em->block_start = 0;
 	em->disk_bytenr = 0;
 	em->disk_num_bytes = SZ_16K;
 	em->ram_bytes = SZ_16K;
@@ -321,11 +313,11 @@  static int __test_case_3(struct btrfs_fs_info *fs_info,
 	 * em->start.
 	 */
 	if (start < em->start || start + len > extent_map_end(em) ||
-	    em->start != em->block_start) {
+	    em->start != extent_map_block_start(em)) {
 		test_err(
-"case3 [%llu %llu): ret %d em (start %llu len %llu block_start %llu block_len %llu)",
+"case3 [%llu %llu): ret %d em (start %llu len %llu disk_bytenr %llu block_len %llu)",
 			 start, start + len, ret, em->start, em->len,
-			 em->block_start, em->disk_num_bytes);
+			 em->disk_bytenr, em->disk_num_bytes);
 		ret = -EINVAL;
 	}
 	free_extent_map(em);
@@ -386,7 +378,6 @@  static int __test_case_4(struct btrfs_fs_info *fs_info,
 	/* Add [0K, 8K) */
 	em->start = 0;
 	em->len = SZ_8K;
-	em->block_start = 0;
 	em->disk_bytenr = 0;
 	em->disk_num_bytes = SZ_8K;
 	em->ram_bytes = SZ_8K;
@@ -409,7 +400,6 @@  static int __test_case_4(struct btrfs_fs_info *fs_info,
 	/* Add [8K, 32K) */
 	em->start = SZ_8K;
 	em->len = 24 * SZ_1K;
-	em->block_start = SZ_16K; /* avoid merging */
 	em->disk_bytenr = SZ_16K; /* avoid merging */
 	em->disk_num_bytes = 24 * SZ_1K;
 	em->ram_bytes = 24 * SZ_1K;
@@ -431,7 +421,6 @@  static int __test_case_4(struct btrfs_fs_info *fs_info,
 	/* Add [0K, 32K) */
 	em->start = 0;
 	em->len = SZ_32K;
-	em->block_start = 0;
 	em->disk_bytenr = 0;
 	em->disk_num_bytes = SZ_32K;
 	em->ram_bytes = SZ_32K;
@@ -451,9 +440,9 @@  static int __test_case_4(struct btrfs_fs_info *fs_info,
 	}
 	if (start < em->start || start + len > extent_map_end(em)) {
 		test_err(
-"case4 [%llu %llu): ret %d, added wrong em (start %llu len %llu block_start %llu disk_num_bytes %llu)",
-			 start, start + len, ret, em->start, em->len, em->block_start,
-			 em->disk_num_bytes);
+"case4 [%llu %llu): ret %d, added wrong em (start %llu len %llu disk_bytenr %llu disk_num_bytes %llu)",
+			 start, start + len, ret, em->start, em->len,
+			 em->disk_bytenr, em->disk_num_bytes);
 		ret = -EINVAL;
 	}
 	free_extent_map(em);
@@ -517,7 +506,6 @@  static int add_compressed_extent(struct btrfs_inode *inode,
 
 	em->start = start;
 	em->len = len;
-	em->block_start = block_start;
 	em->disk_bytenr = block_start;
 	em->disk_num_bytes = SZ_4K;
 	em->ram_bytes = len;
@@ -740,7 +728,6 @@  static int test_case_6(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 
 	em->start = SZ_4K;
 	em->len = SZ_4K;
-	em->block_start = SZ_16K;
 	em->disk_bytenr = SZ_16K;
 	em->disk_num_bytes = SZ_16K;
 	em->ram_bytes = SZ_16K;
@@ -795,7 +782,6 @@  static int test_case_7(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 	/* [0, 16K), pinned */
 	em->start = 0;
 	em->len = SZ_16K;
-	em->block_start = 0;
 	em->disk_bytenr = 0;
 	em->disk_num_bytes = SZ_4K;
 	em->ram_bytes = SZ_16K;
@@ -819,7 +805,6 @@  static int test_case_7(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 	/* [32K, 48K), not pinned */
 	em->start = SZ_32K;
 	em->len = SZ_16K;
-	em->block_start = SZ_32K;
 	em->disk_bytenr = SZ_32K;
 	em->disk_num_bytes = SZ_16K;
 	em->ram_bytes = SZ_16K;
@@ -885,8 +870,9 @@  static int test_case_7(struct btrfs_fs_info *fs_info, struct btrfs_inode *inode)
 		goto out;
 	}
 
-	if (em->block_start != SZ_32K + SZ_4K) {
-		test_err("em->block_start is %llu, expected 36K", em->block_start);
+	if (extent_map_block_start(em) != SZ_32K + SZ_4K) {
+		test_err("em->block_start is %llu, expected 36K",
+				extent_map_block_start(em));
 		goto out;
 	}
 
diff --git a/fs/btrfs/tests/inode-tests.c b/fs/btrfs/tests/inode-tests.c
index 1b8c39edfc18..d6fd1978934a 100644
--- a/fs/btrfs/tests/inode-tests.c
+++ b/fs/btrfs/tests/inode-tests.c
@@ -264,8 +264,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start != EXTENT_MAP_HOLE) {
-		test_err("expected a hole, got %llu", em->block_start);
+	if (em->disk_bytenr != EXTENT_MAP_HOLE) {
+		test_err("expected a hole, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	free_extent_map(em);
@@ -283,8 +283,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start != EXTENT_MAP_INLINE) {
-		test_err("expected an inline, got %llu", em->block_start);
+	if (em->disk_bytenr != EXTENT_MAP_INLINE) {
+		test_err("expected an inline, got %llu", em->disk_bytenr);
 		goto out;
 	}
 
@@ -321,8 +321,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start != EXTENT_MAP_HOLE) {
-		test_err("expected a hole, got %llu", em->block_start);
+	if (em->disk_bytenr != EXTENT_MAP_HOLE) {
+		test_err("expected a hole, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != 4) {
@@ -344,8 +344,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize - 1) {
@@ -371,8 +371,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize) {
@@ -389,7 +389,7 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("wrong offset, want 0, have %llu", em->offset);
 		goto out;
 	}
-	disk_bytenr = em->block_start;
+	disk_bytenr = extent_map_block_start(em);
 	orig_start = em->start;
 	offset = em->start + em->len;
 	free_extent_map(em);
@@ -399,8 +399,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start != EXTENT_MAP_HOLE) {
-		test_err("expected a hole, got %llu", em->block_start);
+	if (em->disk_bytenr != EXTENT_MAP_HOLE) {
+		test_err("expected a hole, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize) {
@@ -421,8 +421,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != 2 * sectorsize) {
@@ -441,9 +441,9 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		goto out;
 	}
 	disk_bytenr += (em->start - orig_start);
-	if (em->block_start != disk_bytenr) {
+	if (extent_map_block_start(em) != disk_bytenr) {
 		test_err("wrong block start, want %llu, have %llu",
-			 disk_bytenr, em->block_start);
+			 disk_bytenr, extent_map_block_start(em));
 		goto out;
 	}
 	offset = em->start + em->len;
@@ -455,8 +455,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize) {
@@ -483,8 +483,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize) {
@@ -502,7 +502,7 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("wrong offset, want 0, have %llu", em->offset);
 		goto out;
 	}
-	disk_bytenr = em->block_start;
+	disk_bytenr = extent_map_block_start(em);
 	orig_start = em->start;
 	offset = em->start + em->len;
 	free_extent_map(em);
@@ -512,8 +512,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_HOLE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_HOLE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize) {
@@ -531,9 +531,9 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 			 em->start - orig_start, em->offset);
 		goto out;
 	}
-	if (em->block_start != disk_bytenr + em->offset) {
+	if (extent_map_block_start(em) != disk_bytenr + em->offset) {
 		test_err("unexpected block start, wanted %llu, have %llu",
-			 disk_bytenr + em->offset, em->block_start);
+			 disk_bytenr + em->offset, extent_map_block_start(em));
 		goto out;
 	}
 	offset = em->start + em->len;
@@ -544,8 +544,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != 2 * sectorsize) {
@@ -564,9 +564,9 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 			 em->start - orig_start, em->offset);
 		goto out;
 	}
-	if (em->block_start != disk_bytenr + em->offset) {
+	if (extent_map_block_start(em) != disk_bytenr + em->offset) {
 		test_err("unexpected block start, wanted %llu, have %llu",
-			 disk_bytenr + em->offset, em->block_start);
+			 disk_bytenr + em->offset, extent_map_block_start(em));
 		goto out;
 	}
 	offset = em->start + em->len;
@@ -578,8 +578,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != 2 * sectorsize) {
@@ -611,8 +611,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize) {
@@ -635,7 +635,7 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 			 BTRFS_COMPRESS_ZLIB, extent_map_compression(em));
 		goto out;
 	}
-	disk_bytenr = em->block_start;
+	disk_bytenr = extent_map_block_start(em);
 	orig_start = em->start;
 	offset = em->start + em->len;
 	free_extent_map(em);
@@ -645,8 +645,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize) {
@@ -671,9 +671,9 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start != disk_bytenr) {
+	if (extent_map_block_start(em) != disk_bytenr) {
 		test_err("block start does not match, want %llu got %llu",
-			 disk_bytenr, em->block_start);
+			 disk_bytenr, extent_map_block_start(em));
 		goto out;
 	}
 	if (em->start != offset || em->len != 2 * sectorsize) {
@@ -706,8 +706,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize) {
@@ -732,8 +732,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start != EXTENT_MAP_HOLE) {
-		test_err("expected a hole extent, got %llu", em->block_start);
+	if (em->disk_bytenr != EXTENT_MAP_HOLE) {
+		test_err("expected a hole extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	/*
@@ -764,8 +764,8 @@  static noinline int test_btrfs_get_extent(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start >= EXTENT_MAP_LAST_BYTE) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (em->disk_bytenr >= EXTENT_MAP_LAST_BYTE) {
+		test_err("expected a real extent, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != offset || em->len != sectorsize) {
@@ -843,8 +843,8 @@  static int test_hole_first(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start != EXTENT_MAP_HOLE) {
-		test_err("expected a hole, got %llu", em->block_start);
+	if (em->disk_bytenr != EXTENT_MAP_HOLE) {
+		test_err("expected a hole, got %llu", em->disk_bytenr);
 		goto out;
 	}
 	if (em->start != 0 || em->len != sectorsize) {
@@ -865,8 +865,9 @@  static int test_hole_first(u32 sectorsize, u32 nodesize)
 		test_err("got an error when we shouldn't have");
 		goto out;
 	}
-	if (em->block_start != sectorsize) {
-		test_err("expected a real extent, got %llu", em->block_start);
+	if (extent_map_block_start(em) != sectorsize) {
+		test_err("expected a real extent, got %llu",
+			 extent_map_block_start(em));
 		goto out;
 	}
 	if (em->start != sectorsize || em->len != sectorsize) {
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 13f35180e3a0..c4b67bf993d6 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -4575,6 +4575,7 @@  static int log_extent_csums(struct btrfs_trans_handle *trans,
 {
 	struct btrfs_ordered_extent *ordered;
 	struct btrfs_root *csum_root;
+	u64 block_start;
 	u64 csum_offset;
 	u64 csum_len;
 	u64 mod_start = em->start;
@@ -4584,7 +4585,7 @@  static int log_extent_csums(struct btrfs_trans_handle *trans,
 
 	if (inode->flags & BTRFS_INODE_NODATASUM ||
 	    (em->flags & EXTENT_FLAG_PREALLOC) ||
-	    em->block_start == EXTENT_MAP_HOLE)
+	    em->disk_bytenr == EXTENT_MAP_HOLE)
 		return 0;
 
 	list_for_each_entry(ordered, &ctx->ordered_extents, log_list) {
@@ -4655,9 +4656,10 @@  static int log_extent_csums(struct btrfs_trans_handle *trans,
 	}
 
 	/* block start is already adjusted for the file extent offset. */
-	csum_root = btrfs_csum_root(trans->fs_info, em->block_start);
-	ret = btrfs_lookup_csums_list(csum_root, em->block_start + csum_offset,
-				      em->block_start + csum_offset +
+	block_start = extent_map_block_start(em);
+	csum_root = btrfs_csum_root(trans->fs_info, block_start);
+	ret = btrfs_lookup_csums_list(csum_root, block_start + csum_offset,
+				      block_start + csum_offset +
 				      csum_len - 1, &ordered_sums, false);
 	if (ret < 0)
 		return ret;
@@ -4689,6 +4691,7 @@  static int log_one_extent(struct btrfs_trans_handle *trans,
 	struct btrfs_key key;
 	enum btrfs_compression_type compress_type;
 	u64 extent_offset = em->offset;
+	u64 block_start = extent_map_block_start(em);
 	u64 block_len;
 	int ret;
 
@@ -4701,10 +4704,10 @@  static int log_one_extent(struct btrfs_trans_handle *trans,
 	block_len = em->disk_num_bytes;
 	compress_type = extent_map_compression(em);
 	if (compress_type != BTRFS_COMPRESS_NONE) {
-		btrfs_set_stack_file_extent_disk_bytenr(&fi, em->block_start);
+		btrfs_set_stack_file_extent_disk_bytenr(&fi, block_start);
 		btrfs_set_stack_file_extent_disk_num_bytes(&fi, block_len);
-	} else if (em->block_start < EXTENT_MAP_LAST_BYTE) {
-		btrfs_set_stack_file_extent_disk_bytenr(&fi, em->block_start -
+	} else if (em->disk_bytenr < EXTENT_MAP_LAST_BYTE) {
+		btrfs_set_stack_file_extent_disk_bytenr(&fi, block_start -
 							extent_offset);
 		btrfs_set_stack_file_extent_disk_num_bytes(&fi, block_len);
 	}
diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
index 4b52a8916dbb..6d0f7fc9aaf2 100644
--- a/fs/btrfs/zoned.c
+++ b/fs/btrfs/zoned.c
@@ -1778,7 +1778,9 @@  static void btrfs_rewrite_logical_zoned(struct btrfs_ordered_extent *ordered,
 	write_lock(&em_tree->lock);
 	em = search_extent_mapping(em_tree, ordered->file_offset,
 				   ordered->num_bytes);
-	em->block_start = logical;
+	/* The em should be a new COW extent, thus it should not has offset. */
+	ASSERT(em->offset == 0);
+	em->disk_bytenr = logical;
 	free_extent_map(em);
 	write_unlock(&em_tree->lock);
 }
diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h
index 3743719d13f2..89b2b66e5bc0 100644
--- a/include/trace/events/btrfs.h
+++ b/include/trace/events/btrfs.h
@@ -291,7 +291,6 @@  TRACE_EVENT_CONDITION(btrfs_get_extent,
 		__field(	u64,  ino		)
 		__field(	u64,  start		)
 		__field(	u64,  len		)
-		__field(	u64,  block_start	)
 		__field(	u32,  flags		)
 		__field(	int,  refs		)
 	),
@@ -301,18 +300,16 @@  TRACE_EVENT_CONDITION(btrfs_get_extent,
 		__entry->ino		= btrfs_ino(inode);
 		__entry->start		= map->start;
 		__entry->len		= map->len;
-		__entry->block_start	= map->block_start;
 		__entry->flags		= map->flags;
 		__entry->refs		= refcount_read(&map->refs);
 	),
 
 	TP_printk_btrfs("root=%llu(%s) ino=%llu start=%llu len=%llu "
-		  "block_start=%llu(%s) flags=%s refs=%u",
+		  "flags=%s refs=%u",
 		  show_root_type(__entry->root_objectid),
 		  __entry->ino,
 		  __entry->start,
 		  __entry->len,
-		  show_map_type(__entry->block_start),
 		  show_map_flags(__entry->flags),
 		  __entry->refs)
 );
@@ -2608,7 +2605,6 @@  TRACE_EVENT(btrfs_extent_map_shrinker_remove_em,
 		__field(	u64,	root_id		)
 		__field(	u64,	start		)
 		__field(	u64,	len		)
-		__field(	u64,	block_start	)
 		__field(	u32,	flags		)
 	),
 
@@ -2617,15 +2613,12 @@  TRACE_EVENT(btrfs_extent_map_shrinker_remove_em,
 		__entry->root_id	= inode->root->root_key.objectid;
 		__entry->start		= em->start;
 		__entry->len		= em->len;
-		__entry->block_start	= em->block_start;
 		__entry->flags		= em->flags;
 	),
 
-	TP_printk_btrfs(
-"ino=%llu root=%llu(%s) start=%llu len=%llu block_start=%llu(%s) flags=%s",
+	TP_printk_btrfs("ino=%llu root=%llu(%s) start=%llu len=%llu flags=%s",
 			__entry->ino, show_root_type(__entry->root_id),
 			__entry->start, __entry->len,
-			show_map_type(__entry->block_start),
 			show_map_flags(__entry->flags))
 );