* inodes in stale state on disk. Hence we have to do a btree lookup
* in all cases where an untrusted inode number is passed.
*/
- if (flags & XFS_IGET_UNTRUSTED) {
- error = xfs_imap_lookup(pag, tp, agino, agbno,
- &chunk_agbno, &offset_agbno, flags);
- if (error)
- return error;
- goto out_map;
- }
+ if (!(flags & XFS_IGET_UNTRUSTED)) {
+ /*
+ * If the inode cluster size is the same or smaller than the
+ * blocksize, get to the buffer by simple arithmetics.
+ */
+ if (M_IGEO(mp)->blocks_per_cluster == 1) {
+ cluster_agbno = agbno;
+ offset = XFS_INO_TO_OFFSET(mp, ino);
+ ASSERT(offset < mp->m_sb.sb_inopblock);
+ goto out;
+ }
- /*
- * If the inode cluster size is the same as the blocksize or
- * smaller we get to the buffer by simple arithmetics.
- */
- if (M_IGEO(mp)->blocks_per_cluster == 1) {
- offset = XFS_INO_TO_OFFSET(mp, ino);
- ASSERT(offset < mp->m_sb.sb_inopblock);
-
- imap->im_blkno = xfs_agbno_to_daddr(pag, agbno);
- imap->im_len = XFS_FSB_TO_BB(mp, 1);
- imap->im_boffset = (unsigned short)(offset <<
- mp->m_sb.sb_inodelog);
- return 0;
- }
+ /*
+ * If the inode chunks are aligned, use simple maths to find the
+ * location.
+ */
+ if (M_IGEO(mp)->inoalign_mask) {
+ offset_agbno = agbno & M_IGEO(mp)->inoalign_mask;
+ chunk_agbno = agbno - offset_agbno;
+ goto out_map;
+ }
- /*
- * If the inode chunks are aligned then use simple maths to
- * find the location. Otherwise we have to do a btree
- * lookup to find the location.
- */
- if (M_IGEO(mp)->inoalign_mask) {
- offset_agbno = agbno & M_IGEO(mp)->inoalign_mask;
- chunk_agbno = agbno - offset_agbno;
- } else {
- error = xfs_imap_lookup(pag, tp, agino, agbno,
- &chunk_agbno, &offset_agbno, flags);
- if (error)
- return error;
+ /*
+ * Otherwise we have to do a btree lookup to find the location.
+ */
}
+ error = xfs_imap_lookup(pag, tp, agino, agbno, &chunk_agbno,
+ &offset_agbno, flags);
+ if (error)
+ return error;
+
out_map:
ASSERT(agbno >= chunk_agbno);
cluster_agbno = chunk_agbno +
M_IGEO(mp)->blocks_per_cluster);
offset = ((agbno - cluster_agbno) * mp->m_sb.sb_inopblock) +
XFS_INO_TO_OFFSET(mp, ino);
-
+out:
imap->im_blkno = xfs_agbno_to_daddr(pag, cluster_agbno);
imap->im_len = XFS_FSB_TO_BB(mp, M_IGEO(mp)->blocks_per_cluster);
imap->im_boffset = (unsigned short)(offset << mp->m_sb.sb_inodelog);