* eofblocks cleanup (which allocates what would be a nested
         * transaction), we can't use DONTCACHE here because DONTCACHE
         * inodes can trigger immediate inactive cleanup of the inode.
+        *
+        * If _iget returns -EINVAL or -ENOENT then the child inode number is
+        * garbage and the directory is corrupt.  If the _iget returns
+        * -EFSCORRUPTED or -EFSBADCRC then the child is corrupt which is a
+        *  cross referencing error.  Any other error is an operational error.
         */
        error = xfs_iget(mp, sdc->sc->tp, inum, 0, 0, &ip);
+       if (error == -EINVAL || error == -ENOENT) {
+               error = -EFSCORRUPTED;
+               xchk_fblock_process_error(sdc->sc, XFS_DATA_FORK, 0, &error);
+               goto out;
+       }
        if (!xchk_fblock_xref_process_error(sdc->sc, XFS_DATA_FORK, offset,
                        &error))
                goto out;
        struct xfs_name         xname;
        xfs_ino_t               lookup_ino;
        xfs_dablk_t             offset;
+       bool                    checked_ftype = false;
        int                     error = 0;
 
        sdc = container_of(dir_iter, struct xchk_dir_ctx, dir_iter);
                if (xfs_sb_version_hasftype(&mp->m_sb) && type != DT_DIR)
                        xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK,
                                        offset);
+               checked_ftype = true;
                if (ino != ip->i_ino)
                        xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK,
                                        offset);
                if (xfs_sb_version_hasftype(&mp->m_sb) && type != DT_DIR)
                        xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK,
                                        offset);
+               checked_ftype = true;
                if (ip->i_ino == mp->m_sb.sb_rootino && ino != ip->i_ino)
                        xchk_fblock_set_corrupt(sdc->sc, XFS_DATA_FORK,
                                        offset);
        }
 
        /* Verify the file type.  This function absorbs error codes. */
-       error = xchk_dir_check_ftype(sdc, offset, lookup_ino, type);
-       if (error)
-               goto out;
+       if (!checked_ftype) {
+               error = xchk_dir_check_ftype(sdc, offset, lookup_ino, type);
+               if (error)
+                       goto out;
+       }
 out:
        /*
         * A negative error code returned here is supposed to cause the