u64 em_len;
                int ret = 0;
 
-               em = btrfs_get_extent(inode, NULL, 0, search_start,
-                                     search_len, 0);
+               em = btrfs_get_extent(inode, NULL, 0, search_start, search_len);
                if (IS_ERR(em))
                        return PTR_ERR(em);
 
 
        em = btrfs_get_extent(BTRFS_I(inode), NULL, 0,
                              round_down(*start, fs_info->sectorsize),
-                             round_up(*len, fs_info->sectorsize), 0);
+                             round_up(*len, fs_info->sectorsize));
        if (IS_ERR(em))
                return PTR_ERR(em);
 
        int ret;
 
        offset = round_down(offset, sectorsize);
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em))
                return PTR_ERR(em);
 
 
        inode_dio_wait(inode);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0,
-                             alloc_start, alloc_end - alloc_start, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, alloc_start,
+                             alloc_end - alloc_start);
        if (IS_ERR(em)) {
                ret = PTR_ERR(em);
                goto out;
 
        if (BTRFS_BYTES_TO_BLKS(fs_info, offset) ==
            BTRFS_BYTES_TO_BLKS(fs_info, offset + len - 1)) {
-               em = btrfs_get_extent(BTRFS_I(inode), NULL, 0,
-                                     alloc_start, sectorsize, 0);
+               em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, alloc_start,
+                                     sectorsize);
                if (IS_ERR(em)) {
                        ret = PTR_ERR(em);
                        goto out;
        INIT_LIST_HEAD(&reserve_list);
        while (cur_offset < alloc_end) {
                em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, cur_offset,
-                                     alloc_end - cur_offset, 0);
+                                     alloc_end - cur_offset);
                if (IS_ERR(em)) {
                        ret = PTR_ERR(em);
                        break;
 
        cur_offset = hole_start;
        while (1) {
                em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, cur_offset,
-                               block_end - cur_offset, 0);
+                                     block_end - cur_offset);
                if (IS_ERR(em)) {
                        err = PTR_ERR(em);
                        em = NULL;
        return ret;
 }
 
-/*
- * a bit scary, this does extent mapping from logical file offset to the disk.
- * the ugly parts come from merging extents from the disk with the in-ram
- * representation.  This gets more complex because of the data=ordered code,
- * where the in-ram extents might be locked pending data=ordered completion.
+/**
+ * btrfs_get_extent - Lookup the first extent overlapping a range in a file.
+ * @inode:     file to search in
+ * @page:      page to read extent data into if the extent is inline
+ * @pg_offset: offset into @page to copy to
+ * @start:     file offset
+ * @len:       length of range starting at @start
+ *
+ * This returns the first &struct extent_map which overlaps with the given
+ * range, reading it from the B-tree and caching it if necessary. Note that
+ * there may be more extents which overlap the given range after the returned
+ * extent_map.
  *
- * This also copies inline extents directly into the page.
+ * If @page is not NULL and the extent is inline, this also reads the extent
+ * data directly into the page and marks the extent up to date in the io_tree.
+ *
+ * Return: ERR_PTR on error, non-NULL extent_map on success.
  */
 struct extent_map *btrfs_get_extent(struct btrfs_inode *inode,
-                                   struct page *page,
-                                   size_t pg_offset, u64 start, u64 len,
-                                   int create)
+                                   struct page *page, size_t pg_offset,
+                                   u64 start, u64 len)
 {
        struct btrfs_fs_info *fs_info = inode->root->fs_info;
        int ret;
        struct extent_map *em = NULL;
        struct extent_map_tree *em_tree = &inode->extent_tree;
        struct extent_io_tree *io_tree = &inode->io_tree;
-       const bool new_inline = !page || create;
 
        read_lock(&em_tree->lock);
        em = lookup_extent_mapping(em_tree, start, len);
                goto insert;
        }
 
-       btrfs_extent_item_to_extent_map(inode, path, item,
-                       new_inline, em);
+       btrfs_extent_item_to_extent_map(inode, path, item, !page, em);
 
        if (extent_type == BTRFS_FILE_EXTENT_REG ||
            extent_type == BTRFS_FILE_EXTENT_PREALLOC) {
                size_t extent_offset;
                size_t copy_size;
 
-               if (new_inline)
+               if (!page)
                        goto out;
 
                size = btrfs_file_extent_ram_bytes(leaf, item);
        u64 delalloc_end;
        int err = 0;
 
-       em = btrfs_get_extent(inode, NULL, 0, start, len, 0);
+       em = btrfs_get_extent(inode, NULL, 0, start, len);
        if (IS_ERR(em))
                return em;
        /*
                goto err;
        }
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, start, len, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, start, len);
        if (IS_ERR(em)) {
                ret = PTR_ERR(em);
                goto unlock_err;
                struct btrfs_block_group *bg;
                u64 len = isize - start;
 
-               em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, start, len, 0);
+               em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, start, len);
                if (IS_ERR(em)) {
                        ret = PTR_ERR(em);
                        goto out;
 
 
        /* First with no extents */
        BTRFS_I(inode)->root = root;
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, 0, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, 0, sectorsize);
        if (IS_ERR(em)) {
                em = NULL;
                test_err("got an error when we shouldn't have");
         */
        setup_file_extents(root, sectorsize);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, 0, (u64)-1, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, 0, (u64)-1);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        free_extent_map(em);
 
        /* Regular extent */
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        free_extent_map(em);
 
        /* The next 3 are split extents */
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        free_extent_map(em);
 
        /* Prealloc extent */
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        free_extent_map(em);
 
        /* The next 3 are a half written prealloc extent */
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        free_extent_map(em);
 
        /* Now for the compressed extent */
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        free_extent_map(em);
 
        /* Split compressed extent */
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        free_extent_map(em);
 
        /* A hole between regular extents but no hole extent */
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset + 6,
-                       sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset + 6, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, SZ_4M, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, SZ_4M);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        offset = em->start + em->len;
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, offset, sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        insert_inode_item_key(root);
        insert_extent(root, sectorsize, sectorsize, sectorsize, 0, sectorsize,
                      sectorsize, BTRFS_FILE_EXTENT_REG, 0, 1);
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, 0, 2 * sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, 0, 2 * sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;
        }
        free_extent_map(em);
 
-       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, sectorsize,
-                       2 * sectorsize, 0);
+       em = btrfs_get_extent(BTRFS_I(inode), NULL, 0, sectorsize, 2 * sectorsize);
        if (IS_ERR(em)) {
                test_err("got an error when we shouldn't have");
                goto out;