struct xfs_find_left_neighbor_info {
        struct xfs_rmap_irec    high;
        struct xfs_rmap_irec    *irec;
-       int                     *stat;
 };
 
 /* For each rmap given, figure out if it matches the key we want. */
                return 0;
 
        *info->irec = *rec;
-       *info->stat = 1;
        return -ECANCELED;
 }
 
  * return a match with the same owner and adjacent physical and logical
  * block ranges.
  */
-int
+STATIC int
 xfs_rmap_find_left_neighbor(
        struct xfs_btree_cur    *cur,
        xfs_agblock_t           bno,
        int                     *stat)
 {
        struct xfs_find_left_neighbor_info      info;
+       int                     found = 0;
        int                     error;
 
        *stat = 0;
        info.high.rm_flags = flags;
        info.high.rm_blockcount = 0;
        info.irec = irec;
-       info.stat = stat;
 
        trace_xfs_rmap_find_left_neighbor_query(cur->bc_mp,
                        cur->bc_ag.pag->pag_agno, bno, 0, owner, offset, flags);
 
-       error = xfs_rmap_query_range(cur, &info.high, &info.high,
-                       xfs_rmap_find_left_neighbor_helper, &info);
-       if (error == -ECANCELED)
-               error = 0;
-       if (*stat)
-               trace_xfs_rmap_find_left_neighbor_result(cur->bc_mp,
-                               cur->bc_ag.pag->pag_agno, irec->rm_startblock,
-                               irec->rm_blockcount, irec->rm_owner,
-                               irec->rm_offset, irec->rm_flags);
-       return error;
+       /*
+        * Historically, we always used the range query to walk every reverse
+        * mapping that could possibly overlap the key that the caller asked
+        * for, and filter out the ones that don't.  That is very slow when
+        * there are a lot of records.
+        *
+        * However, there are two scenarios where the classic btree search can
+        * produce correct results -- if the index contains a record that is an
+        * exact match for the lookup key; and if there are no other records
+        * between the record we want and the key we supplied.
+        *
+        * As an optimization, try a non-overlapped lookup first.  This makes
+        * extent conversion and remap operations run a bit faster if the
+        * physical extents aren't being shared.  If we don't find what we
+        * want, we fall back to the overlapped query.
+        */
+       error = xfs_rmap_lookup_le(cur, bno, owner, offset, flags, irec,
+                       &found);
+       if (error)
+               return error;
+       if (found)
+               error = xfs_rmap_find_left_neighbor_helper(cur, irec, &info);
+       if (!error)
+               error = xfs_rmap_query_range(cur, &info.high, &info.high,
+                               xfs_rmap_find_left_neighbor_helper, &info);
+       if (error != -ECANCELED)
+               return error;
+
+       *stat = 1;
+       trace_xfs_rmap_find_left_neighbor_result(cur->bc_mp,
+                       cur->bc_ag.pag->pag_agno, irec->rm_startblock,
+                       irec->rm_blockcount, irec->rm_owner, irec->rm_offset,
+                       irec->rm_flags);
+       return 0;
 }
 
 /* For each rmap given, figure out if it matches the key we want. */
 
                xfs_fsblock_t startblock, xfs_filblks_t blockcount,
                xfs_exntst_t state, struct xfs_btree_cur **pcur);
 
-int xfs_rmap_find_left_neighbor(struct xfs_btree_cur *cur, xfs_agblock_t bno,
-               uint64_t owner, uint64_t offset, unsigned int flags,
-               struct xfs_rmap_irec *irec, int *stat);
 int xfs_rmap_lookup_le_range(struct xfs_btree_cur *cur, xfs_agblock_t bno,
                uint64_t owner, uint64_t offset, unsigned int flags,
                struct xfs_rmap_irec *irec, int *stat);