diff --git a/tsk/fs/xfs.cpp b/tsk/fs/xfs.cpp
index 8d78be7f7c2395555bafc2722aa3cd862c442eba..c245eec0c2beb1c87304beb0a943d93d3051cccb 100644
--- a/tsk/fs/xfs.cpp
+++ b/tsk/fs/xfs.cpp
@@ -1505,6 +1505,7 @@ xfs_load_attrs(TSK_FS_FILE * fs_file)
                 return 1;
             }
 
+            // converting xfs block numbers to disk addr
             xfs_agnumber_t ag_num = irec.br_startblock >> xfs->fs->sb_agblklog;
             uint64_t rel_blk_neg = 1 << (xfs->fs->sb_agblklog);
             rel_blk_neg -= 1;
@@ -1513,10 +1514,8 @@ xfs_load_attrs(TSK_FS_FILE * fs_file)
                 * (TSK_OFF_T) xfs->fs->sb_agblocks + rel_blk) 
                 * (TSK_OFF_T) fs_info->block_size;
 
-            // converting logical xfs block number into a "physical" number
-            // this block number is later processed by tsk_fs_read_block,
-            // which does (TSK_OFF_T) (a_addr) * a_fs->block_size
-            data_run->offset = data_run->addr = offset / fs_info->block_size;
+            data_run->offset = irec.br_startoff;
+            data_run->addr = offset / fs_info->block_size;
             data_run->len = irec.br_blockcount;
 
             if (tsk_fs_attr_add_run(fs_info, fs_attr, data_run)) {
@@ -1692,17 +1691,22 @@ static TSK_WALK_RET_ENUM
 print_addr_act(TSK_FS_FILE * fs_file, TSK_OFF_T a_off, TSK_DADDR_T addr,
     char *buf, size_t size, TSK_FS_BLOCK_FLAG_ENUM flags, void *a_ptr)
 {
-    TSK_FS_INFO *fs = fs_file->fs_info;
+    XFSFS_INFO *xfs = (XFSFS_INFO *) fs_file->fs_info;
     XFS_PRINT_ADDR *print = (XFS_PRINT_ADDR *) a_ptr;
 
+    // addr -> xfs fsblock
+    xfs_agnumber_t ag_num = addr >> xfs->fs->sb_agblklog;
+    uint64_t rel_blk = addr -(TSK_DADDR_T) ag_num * (TSK_DADDR_T) xfs->fs->sb_agblocks;
+    TSK_DADDR_T fsblock_addr = (ag_num << xfs->fs->sb_agblklog) | rel_blk;
+
     if (flags & TSK_FS_BLOCK_FLAG_CONT) {
         int i, s;
         /* cycle through the blocks if they exist */
-        for (i = 0, s = (int) size; s > 0; s -= fs->block_size, i++) {
+        for (i = 0, s = (int) size; s > 0; s -= xfs->fs_info.block_size, i++) {
 
             /* sparse file */
-            if (addr)
-                tsk_fprintf(print->hFile, "%" PRIuDADDR " ", addr + i);
+            if (fsblock_addr)
+                tsk_fprintf(print->hFile, "%" PRIuDADDR " ", fsblock_addr + i);
             else
                 tsk_fprintf(print->hFile, "0 ");