uint8       recid;
    uint32      rec_len;
    uint32      fpi_len;
+   int         block_id;
 
    stats->count++;
 
-   /* Update per-rmgr statistics */
-
    rmid = XLogRecGetRmid(record);
    rec_len = XLogRecGetDataLen(record) + SizeOfXLogRecord;
-   fpi_len = record->decoded_record->xl_tot_len - rec_len;
+
+   /*
+    * Calculate the amount of FPI data in the record. Each backup block
+    * takes up BLCKSZ bytes, minus the "hole" length.
+    *
+    * XXX: We peek into xlogreader's private decoded backup blocks for the
+    * hole_length. It doesn't seem worth it to add an accessor macro for
+    * this.
+    */
+   fpi_len = 0;
+   for (block_id = 0; block_id <= record->max_block_id; block_id++)
+   {
+       if (XLogRecHasBlockImage(record, block_id))
+           fpi_len += BLCKSZ - record->blocks[block_id].hole_length;
+   }
+
+   /* Update per-rmgr statistics */
 
    stats->rmgr_stats[rmid].count++;
    stats->rmgr_stats[rmid].rec_len += rec_len;