int btrfs_inode_set_file_extent_range(struct btrfs_inode *inode, u64 start,
                                      u64 len);
 void btrfs_inode_safe_disk_i_size_write(struct inode *inode, u64 new_i_size);
+u64 btrfs_file_extent_end(const struct btrfs_path *path);
 
 /* inode.c */
 struct extent_map *btrfs_get_extent_fiemap(struct btrfs_inode *inode,
 
 
        btrfs_item_key_to_cpu(leaf, &key, slot);
        extent_start = key.offset;
-
-       if (type == BTRFS_FILE_EXTENT_REG ||
-           type == BTRFS_FILE_EXTENT_PREALLOC) {
-               extent_end = extent_start +
-                       btrfs_file_extent_num_bytes(leaf, fi);
-       } else if (type == BTRFS_FILE_EXTENT_INLINE) {
-               size_t size;
-               size = btrfs_file_extent_ram_bytes(leaf, fi);
-               extent_end = ALIGN(extent_start + size,
-                                  fs_info->sectorsize);
-       }
-
+       extent_end = btrfs_file_extent_end(path);
        em->ram_bytes = btrfs_file_extent_ram_bytes(leaf, fi);
        if (type == BTRFS_FILE_EXTENT_REG ||
            type == BTRFS_FILE_EXTENT_PREALLOC) {
                          root->root_key.objectid);
        }
 }
+
+/*
+ * Returns the end offset (non inclusive) of the file extent item the given path
+ * points to. If it points to an inline extent, the returned offset is rounded
+ * up to the sector size.
+ */
+u64 btrfs_file_extent_end(const struct btrfs_path *path)
+{
+       const struct extent_buffer *leaf = path->nodes[0];
+       const int slot = path->slots[0];
+       struct btrfs_file_extent_item *fi;
+       struct btrfs_key key;
+       u64 end;
+
+       btrfs_item_key_to_cpu(leaf, &key, slot);
+       ASSERT(key.type == BTRFS_EXTENT_DATA_KEY);
+       fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
+
+       if (btrfs_file_extent_type(leaf, fi) == BTRFS_FILE_EXTENT_INLINE) {
+               end = btrfs_file_extent_ram_bytes(leaf, fi);
+               end = ALIGN(key.offset + end, leaf->fs_info->sectorsize);
+       } else {
+               end = key.offset + btrfs_file_extent_num_bytes(leaf, fi);
+       }
+
+       return end;
+}
 
 
        extent_type = btrfs_file_extent_type(leaf, item);
        extent_start = found_key.offset;
+       extent_end = btrfs_file_extent_end(path);
        if (extent_type == BTRFS_FILE_EXTENT_REG ||
            extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
                /* Only regular file could have regular/prealloc extent */
                                   btrfs_ino(inode));
                        goto out;
                }
-               extent_end = extent_start +
-                      btrfs_file_extent_num_bytes(leaf, item);
-
                trace_btrfs_get_extent_show_fi_regular(inode, leaf, item,
                                                       extent_start);
        } else if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
-               size_t size;
-
-               size = btrfs_file_extent_ram_bytes(leaf, item);
-               extent_end = ALIGN(extent_start + size,
-                                  fs_info->sectorsize);
-
                trace_btrfs_get_extent_show_fi_inline(inode, leaf, item,
                                                      path->slots[0],
                                                      extent_start);
 
 {
        struct btrfs_path *path;
        struct btrfs_root *root = sctx->send_root;
-       struct btrfs_file_extent_item *fi;
        struct btrfs_key key;
-       u64 extent_end;
-       u8 type;
        int ret;
 
        path = alloc_path_for_send();
        if (key.objectid != sctx->cur_ino || key.type != BTRFS_EXTENT_DATA_KEY)
                goto out;
 
-       fi = btrfs_item_ptr(path->nodes[0], path->slots[0],
-                           struct btrfs_file_extent_item);
-       type = btrfs_file_extent_type(path->nodes[0], fi);
-       if (type == BTRFS_FILE_EXTENT_INLINE) {
-               u64 size = btrfs_file_extent_ram_bytes(path->nodes[0], fi);
-               extent_end = ALIGN(key.offset + size,
-                                  sctx->send_root->fs_info->sectorsize);
-       } else {
-               extent_end = key.offset +
-                       btrfs_file_extent_num_bytes(path->nodes[0], fi);
-       }
-       sctx->cur_inode_last_extent = extent_end;
+       sctx->cur_inode_last_extent = btrfs_file_extent_end(path);
 out:
        btrfs_free_path(path);
        return ret;
                        break;
 
                fi = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
-               if (btrfs_file_extent_type(leaf, fi) ==
-                   BTRFS_FILE_EXTENT_INLINE) {
-                       u64 size = btrfs_file_extent_ram_bytes(leaf, fi);
-
-                       extent_end = ALIGN(key.offset + size,
-                                          root->fs_info->sectorsize);
-               } else {
-                       extent_end = key.offset +
-                               btrfs_file_extent_num_bytes(leaf, fi);
-               }
+               extent_end = btrfs_file_extent_end(path);
                if (extent_end <= start)
                        goto next;
                if (btrfs_file_extent_disk_bytenr(leaf, fi) == 0) {
 static int maybe_send_hole(struct send_ctx *sctx, struct btrfs_path *path,
                           struct btrfs_key *key)
 {
-       struct btrfs_file_extent_item *fi;
-       u64 extent_end;
-       u8 type;
        int ret = 0;
 
        if (sctx->cur_ino != key->objectid || !need_send_hole(sctx))
                        return ret;
        }
 
-       fi = btrfs_item_ptr(path->nodes[0], path->slots[0],
-                           struct btrfs_file_extent_item);
-       type = btrfs_file_extent_type(path->nodes[0], fi);
-       if (type == BTRFS_FILE_EXTENT_INLINE) {
-               u64 size = btrfs_file_extent_ram_bytes(path->nodes[0], fi);
-               extent_end = ALIGN(key->offset + size,
-                                  sctx->send_root->fs_info->sectorsize);
-       } else {
-               extent_end = key->offset +
-                       btrfs_file_extent_num_bytes(path->nodes[0], fi);
-       }
-
        if (path->slots[0] == 0 &&
            sctx->cur_inode_last_extent < key->offset) {
                /*
                else
                        ret = 0;
        }
-       sctx->cur_inode_last_extent = extent_end;
+       sctx->cur_inode_last_extent = btrfs_file_extent_end(path);
        return ret;
 }
 
 
                return ret;
 
        while (true) {
-               struct btrfs_file_extent_item *extent;
                struct extent_buffer *leaf = path->nodes[0];
-               u64 len;
 
                if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {
                        ret = btrfs_next_leaf(root, path);
                        leaf = path->nodes[0];
                }
 
-               extent = btrfs_item_ptr(leaf, path->slots[0],
-                                       struct btrfs_file_extent_item);
-               if (btrfs_file_extent_type(leaf, extent) ==
-                   BTRFS_FILE_EXTENT_INLINE) {
-                       len = btrfs_file_extent_ram_bytes(leaf, extent);
-                       prev_extent_end = ALIGN(key.offset + len,
-                                               fs_info->sectorsize);
-               } else {
-                       len = btrfs_file_extent_num_bytes(leaf, extent);
-                       prev_extent_end = key.offset + len;
-               }
-
+               prev_extent_end = btrfs_file_extent_end(path);
                path->slots[0]++;
                cond_resched();
        }