xfs_daddr_t             next_daddr;     /* next daddr we expect */
        /* daddr of low fsmap key when we're using the rtbitmap */
        xfs_daddr_t             low_daddr;
-       xfs_daddr_t             end_daddr;      /* daddr of high fsmap key */
+       /* daddr of high fsmap key, or the last daddr on the device */
+       xfs_daddr_t             end_daddr;
        u64                     missing_owner;  /* owner of holes */
        u32                     dev;            /* device id */
        /*
         * we calculated from userspace's high key to synthesize the record.
         * Note that if the btree query found a mapping, there won't be a gap.
         */
-       if (info->last && info->end_daddr != XFS_BUF_DADDR_NULL)
-               frec->start_daddr = info->end_daddr;
+       if (info->last)
+               frec->start_daddr = info->end_daddr + 1;
        else
                frec->start_daddr = xfs_gbno_to_daddr(xg, startblock);
 
         * we calculated from userspace's high key to synthesize the record.
         * Note that if the btree query found a mapping, there won't be a gap.
         */
-       if (info->last && info->end_daddr != XFS_BUF_DADDR_NULL) {
-               frec.start_daddr = info->end_daddr;
-       } else {
+       if (info->last)
+               frec.start_daddr = info->end_daddr + 1;
+       else
                frec.start_daddr = xfs_rtb_to_daddr(mp, start_rtb);
-       }
 
        frec.len_daddr = XFS_FSB_TO_BB(mp, rtbcount);
        return xfs_getfsmap_helper(tp, info, &frec);
        struct xfs_trans                *tp = NULL;
        struct xfs_fsmap                dkeys[2];       /* per-dev keys */
        struct xfs_getfsmap_dev         handlers[XFS_GETFSMAP_DEVS];
-       struct xfs_getfsmap_info        info = { NULL };
+       struct xfs_getfsmap_info        info = {
+               .fsmap_recs             = fsmap_recs,
+               .head                   = head,
+       };
        bool                            use_rmap;
        int                             i;
        int                             error = 0;
 
        info.next_daddr = head->fmh_keys[0].fmr_physical +
                          head->fmh_keys[0].fmr_length;
-       info.end_daddr = XFS_BUF_DADDR_NULL;
-       info.fsmap_recs = fsmap_recs;
-       info.head = head;
 
        /* For each device we support... */
        for (i = 0; i < XFS_GETFSMAP_DEVS; i++) {
                        break;
 
                /*
-                * If this device number matches the high key, we have
-                * to pass the high key to the handler to limit the
-                * query results.  If the device number exceeds the
-                * low key, zero out the low key so that we get
-                * everything from the beginning.
+                * If this device number matches the high key, we have to pass
+                * the high key to the handler to limit the query results, and
+                * set the end_daddr so that we can synthesize records at the
+                * end of the query range or device.
                 */
                if (handlers[i].dev == head->fmh_keys[1].fmr_device) {
                        dkeys[1] = head->fmh_keys[1];
                        info.end_daddr = min(handlers[i].nr_sectors - 1,
                                             dkeys[1].fmr_physical);
+               } else {
+                       info.end_daddr = handlers[i].nr_sectors - 1;
                }
+
+               /*
+                * If the device number exceeds the low key, zero out the low
+                * key so that we get everything from the beginning.
+                */
                if (handlers[i].dev > head->fmh_keys[0].fmr_device)
                        memset(&dkeys[0], 0, sizeof(struct xfs_fsmap));