diff --git a/tsk/fs/xfs.cpp b/tsk/fs/xfs.cpp
index e6cae7048f3427e634889904ce9768467a6791b7..69dc383cc752f4e9b41cbc8a3f9d67aae95980e4 100644
--- a/tsk/fs/xfs.cpp
+++ b/tsk/fs/xfs.cpp
@@ -444,6 +444,53 @@ xfs_dinode_load(XFSFS_INFO * xfsfs, TSK_INUM_T dino_inum,
     return 0;
 }
 
+static TSK_FS_META_TYPE_ENUM
+get_file_type(uint16_t xfs_ftype)
+{
+    switch (xfs_ftype) {
+        case XFS_IN_REG:
+            return TSK_FS_META_TYPE_REG;
+        case XFS_IN_DIR:
+            return TSK_FS_META_TYPE_DIR;
+        case XFS_IN_SOCK:
+            return TSK_FS_META_TYPE_SOCK;
+        case XFS_IN_LNK:
+            return TSK_FS_META_TYPE_LNK;
+        case XFS_IN_BLK:
+            return TSK_FS_META_TYPE_BLK;
+        case XFS_IN_CHR:
+            return TSK_FS_META_TYPE_CHR;
+        case XFS_IN_FIFO:
+            return TSK_FS_META_TYPE_FIFO;
+        default:
+            return TSK_FS_META_TYPE_UNDEF;
+    }
+}
+
+static TSK_RETVAL_ENUM
+get_inode_file_type(XFSFS_INFO *xfs, TSK_INUM_T meta_addr, uint8_t *xfs_ftype)
+{
+    xfs_dinode_t *dino_buf = NULL;
+    xfs_sb_t *sb = xfs->fs;
+
+    ssize_t dinodesize = sb->sb_inodesize > sizeof(xfs_dinode)
+        ? sb->sb_inodesize
+        : sizeof(xfs_dinode);
+
+    if ((dino_buf = static_cast<xfs_dinode_t *>(tsk_malloc(dinodesize))) == NULL)
+        return TSK_ERR;
+
+    if (xfs_dinode_load(xfs, meta_addr, dino_buf)) {
+        free(dino_buf);
+        return TSK_ERR;
+    }
+
+    *xfs_ftype = dino_buf->di_core.di_mode & XFS_IN_FMT;
+    free(dino_buf);
+
+    return TSK_OK;
+}
+
 static inline uint64_t xfs_mask64lo(int n)
 {
     return ((uint64_t)1 << (n)) - 1;
@@ -501,32 +548,7 @@ xfs_dinode_copy(XFSFS_INFO * xfsfs, TSK_FS_META * fs_meta,
     }
 
     // set the type
-    switch (dino_buf->di_core.di_mode & XFS_IN_FMT) {
-    case XFS_IN_REG:
-        fs_meta->type = TSK_FS_META_TYPE_REG;
-        break;
-    case XFS_IN_DIR:
-        fs_meta->type = TSK_FS_META_TYPE_DIR;
-        break;
-    case XFS_IN_SOCK:
-        fs_meta->type = TSK_FS_META_TYPE_SOCK;
-        break;
-    case XFS_IN_LNK:
-        fs_meta->type = TSK_FS_META_TYPE_LNK;
-        break;
-    case XFS_IN_BLK:
-        fs_meta->type = TSK_FS_META_TYPE_BLK;
-        break;
-    case XFS_IN_CHR:
-        fs_meta->type = TSK_FS_META_TYPE_CHR;
-        break;
-    case XFS_IN_FIFO:
-        fs_meta->type = TSK_FS_META_TYPE_FIFO;
-        break;
-    default:
-        fs_meta->type = TSK_FS_META_TYPE_UNDEF;
-        break;
-    }
+    fs_meta->type = get_file_type(dino_buf->di_core.di_mode & XFS_IN_FMT);
 
     // set the mode
     fs_meta->mode = (TSK_FS_META_MODE_ENUM) 0;
@@ -2018,6 +2040,7 @@ parse_dir_block(
     char *dirbuf = NULL;
     XFSFS_INFO *xfs = (XFSFS_INFO *) a_fs;
     xfs_sb_t *sb = xfs->fs;
+    TSK_RETVAL_ENUM ret;
 
     uint8_t ftype_size = xfs_sb_version_hasftype(sb) ? sizeof(uint8_t) : 0;
 
@@ -2132,52 +2155,15 @@ parse_dir_block(
                 }
                 else
                 {
-                    xfs_dinode_t *dino_buf = NULL;
-                    ssize_t dinodesize = sb->sb_inodesize > sizeof(xfs_dinode)
-                        ? sb->sb_inodesize
-                        : sizeof(xfs_dinode);
-                    if ((dino_buf = static_cast<xfs_dinode_t *>(tsk_malloc(dinodesize))) == NULL) {
+                    ret = get_inode_file_type(xfs, fs_name->meta_addr, &ftype);
+                    if (ret) {
                         free(dirbuf);
-                        return TSK_ERR;
+                        return ret;
                     }
-
-                    if (xfs_dinode_load(xfs, fs_name->meta_addr, dino_buf)) {
-                        free(dirbuf);
-                        free(dino_buf);
-                        return TSK_ERR;
-                    }
-
-                    ftype = dino_buf->di_core.di_mode & XFS_IN_FMT;
-                    free(dino_buf);
                 }
 
                 uint32_t ftype32 = (uint32_t) ftype << 12;
-                switch (ftype32) {
-                case XFS_IN_REG:
-                    fs_meta->type = TSK_FS_META_TYPE_REG;
-                    break;
-                case XFS_IN_DIR:
-                    fs_meta->type = TSK_FS_META_TYPE_DIR;
-                    break;
-                case XFS_IN_SOCK:
-                    fs_meta->type = TSK_FS_META_TYPE_SOCK;
-                    break;
-                case XFS_IN_LNK:
-                    fs_meta->type = TSK_FS_META_TYPE_LNK;
-                    break;
-                case XFS_IN_BLK:
-                    fs_meta->type = TSK_FS_META_TYPE_BLK;
-                    break;
-                case XFS_IN_CHR:
-                    fs_meta->type = TSK_FS_META_TYPE_CHR;
-                    break;
-                case XFS_IN_FIFO:
-                    fs_meta->type = TSK_FS_META_TYPE_FIFO;
-                    break;
-                default:
-                    fs_meta->type = TSK_FS_META_TYPE_UNDEF;
-                    break;
-                }
+                fs_meta->type = get_file_type(ftype32);
 
                 // we iterate over allocated directories
                 fs_name->flags = TSK_FS_NAME_FLAG_ALLOC;
@@ -2434,6 +2420,7 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
     TSK_FS_DIR *fs_dir;
     TSK_RETVAL_ENUM retval = TSK_OK;
     TSK_FS_NAME *fs_name;
+    TSK_RETVAL_ENUM ret;
 
     // Assuming fs_meta->type == TSK_FS_META_TYPE_DIR
 
@@ -2542,52 +2529,15 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
             }
             else
             {
-                xfs_dinode_t *dino_buf = NULL;
-                ssize_t dinode_size = sb->sb_inodesize > sizeof(xfs_dinode)
-                    ? sb->sb_inodesize
-                    : sizeof(xfs_dinode);
-                if ((dino_buf =
-                    static_cast<xfs_dinode_t *>(tsk_malloc(dinode_size))) == NULL) {
-                    return TSK_ERR;
-                }
-
-                if (xfs_dinode_load(xfs, fs_name->meta_addr, dino_buf)) {
-                    free(dino_buf);
-                    return TSK_ERR;
+                ret = get_inode_file_type(xfs, fs_name->meta_addr, &ftype);
+                if (ret) {
+                    free(dirbuf);
+                    return ret;
                 }
-
-                ftype = dino_buf->di_core.di_mode & XFS_IN_FMT;
-
-                free(dino_buf);
             }
 
             uint32_t ftype32 = (uint32_t) ftype << 12;
-            switch (ftype32) {
-            case XFS_IN_REG:
-                fs_meta->type = TSK_FS_META_TYPE_REG;
-                break;
-            case XFS_IN_DIR:
-                fs_meta->type = TSK_FS_META_TYPE_DIR;
-                break;
-            case XFS_IN_SOCK:
-                fs_meta->type = TSK_FS_META_TYPE_SOCK;
-                break;
-            case XFS_IN_LNK:
-                fs_meta->type = TSK_FS_META_TYPE_LNK;
-                break;
-            case XFS_IN_BLK:
-                fs_meta->type = TSK_FS_META_TYPE_BLK;
-                break;
-            case XFS_IN_CHR:
-                fs_meta->type = TSK_FS_META_TYPE_CHR;
-                break;
-            case XFS_IN_FIFO:
-                fs_meta->type = TSK_FS_META_TYPE_FIFO;
-                break;
-            default:
-                fs_meta->type = TSK_FS_META_TYPE_UNDEF;
-                break;
-            }
+            fs_meta->type = get_file_type(ftype32);
 
             fs_name->flags = (TSK_FS_NAME_FLAG_ENUM) 0;
 
@@ -2757,52 +2707,15 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir,
                     }
                     else
                     {
-                        xfs_dinode_t *dino_buf = NULL;
-                        ssize_t dinodesize = sb->sb_inodesize > sizeof(xfs_dinode)
-                            ? sb->sb_inodesize
-                            : sizeof(xfs_dinode);
-                        if ((dino_buf =
-                            static_cast<xfs_dinode_t *>(tsk_malloc(dinodesize))) == NULL) {
-                            return TSK_ERR;
-                        }
-
-                        if (xfs_dinode_load(xfs, fs_name->meta_addr, dino_buf)) {
+                        ret = get_inode_file_type(xfs, fs_name->meta_addr, &ftype);
+                        if (ret) {
                             free(dirbuf);
-                            free(dino_buf);
-                            return TSK_ERR;
+                            return ret;
                         }
-
-                        ftype = dino_buf->di_core.di_mode & XFS_IN_FMT;
-                        free(dino_buf);
                     }
 
                     uint32_t ftype32 = (uint32_t) ftype << 12;
-                    switch (ftype32) {
-                    case XFS_IN_REG:
-                        fs_meta->type = TSK_FS_META_TYPE_REG;
-                        break;
-                    case XFS_IN_DIR:
-                        fs_meta->type = TSK_FS_META_TYPE_DIR;
-                        break;
-                    case XFS_IN_SOCK:
-                        fs_meta->type = TSK_FS_META_TYPE_SOCK;
-                        break;
-                    case XFS_IN_LNK:
-                        fs_meta->type = TSK_FS_META_TYPE_LNK;
-                        break;
-                    case XFS_IN_BLK:
-                        fs_meta->type = TSK_FS_META_TYPE_BLK;
-                        break;
-                    case XFS_IN_CHR:
-                        fs_meta->type = TSK_FS_META_TYPE_CHR;
-                        break;
-                    case XFS_IN_FIFO:
-                        fs_meta->type = TSK_FS_META_TYPE_FIFO;
-                        break;
-                    default:
-                        fs_meta->type = TSK_FS_META_TYPE_UNDEF;
-                        break;
-                    }
+                    fs_meta->type = get_file_type(ftype32);
 
                     // we iterate over allocated directories
                     fs_name->flags = TSK_FS_NAME_FLAG_ALLOC;