xfs: convert xfs_imap() to take a perag
authorDave Chinner <dchinner@redhat.com>
Sun, 12 Feb 2023 22:14:52 +0000 (09:14 +1100)
committerDave Chinner <dchinner@redhat.com>
Sun, 12 Feb 2023 22:14:52 +0000 (09:14 +1100)
Callers have referenced perags but they don't pass it into
xfs_imap() so it takes it's own reference. Fix that so we can change
inode allocation over to using active references.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/libxfs/xfs_ialloc.c
fs/xfs/libxfs/xfs_ialloc.h
fs/xfs/scrub/common.c
fs/xfs/xfs_icache.c

index e8068422aa21fbeccc29626a89056ac2b8316512..f120a48813cc9647d6c799050f42155714a119f3 100644 (file)
@@ -2217,15 +2217,15 @@ error0:
 
 STATIC int
 xfs_imap_lookup(
-       struct xfs_mount        *mp,
-       struct xfs_trans        *tp,
        struct xfs_perag        *pag,
+       struct xfs_trans        *tp,
        xfs_agino_t             agino,
        xfs_agblock_t           agbno,
        xfs_agblock_t           *chunk_agbno,
        xfs_agblock_t           *offset_agbno,
        int                     flags)
 {
+       struct xfs_mount        *mp = pag->pag_mount;
        struct xfs_inobt_rec_incore rec;
        struct xfs_btree_cur    *cur;
        struct xfs_buf          *agbp;
@@ -2280,12 +2280,13 @@ xfs_imap_lookup(
  */
 int
 xfs_imap(
-       struct xfs_mount         *mp,   /* file system mount structure */
-       struct xfs_trans         *tp,   /* transaction pointer */
+       struct xfs_perag        *pag,
+       struct xfs_trans        *tp,
        xfs_ino_t               ino,    /* inode to locate */
        struct xfs_imap         *imap,  /* location map structure */
        uint                    flags)  /* flags for inode btree lookup */
 {
+       struct xfs_mount        *mp = pag->pag_mount;
        xfs_agblock_t           agbno;  /* block number of inode in the alloc group */
        xfs_agino_t             agino;  /* inode number within alloc group */
        xfs_agblock_t           chunk_agbno;    /* first block in inode chunk */
@@ -2293,17 +2294,15 @@ xfs_imap(
        int                     error;  /* error code */
        int                     offset; /* index of inode in its buffer */
        xfs_agblock_t           offset_agbno;   /* blks from chunk start to inode */
-       struct xfs_perag        *pag;
 
        ASSERT(ino != NULLFSINO);
 
        /*
         * Split up the inode number into its parts.
         */
-       pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino));
        agino = XFS_INO_TO_AGINO(mp, ino);
        agbno = XFS_AGINO_TO_AGBNO(mp, agino);
-       if (!pag || agbno >= mp->m_sb.sb_agblocks ||
+       if (agbno >= mp->m_sb.sb_agblocks ||
            ino != XFS_AGINO_TO_INO(mp, pag->pag_agno, agino)) {
                error = -EINVAL;
 #ifdef DEBUG
@@ -2312,20 +2311,14 @@ xfs_imap(
                 * as they can be invalid without implying corruption.
                 */
                if (flags & XFS_IGET_UNTRUSTED)
-                       goto out_drop;
-               if (!pag) {
-                       xfs_alert(mp,
-                               "%s: agno (%d) >= mp->m_sb.sb_agcount (%d)",
-                               __func__, XFS_INO_TO_AGNO(mp, ino),
-                               mp->m_sb.sb_agcount);
-               }
+                       return error;
                if (agbno >= mp->m_sb.sb_agblocks) {
                        xfs_alert(mp,
                "%s: agbno (0x%llx) >= mp->m_sb.sb_agblocks (0x%lx)",
                                __func__, (unsigned long long)agbno,
                                (unsigned long)mp->m_sb.sb_agblocks);
                }
-               if (pag && ino != XFS_AGINO_TO_INO(mp, pag->pag_agno, agino)) {
+               if (ino != XFS_AGINO_TO_INO(mp, pag->pag_agno, agino)) {
                        xfs_alert(mp,
                "%s: ino (0x%llx) != XFS_AGINO_TO_INO() (0x%llx)",
                                __func__, ino,
@@ -2333,7 +2326,7 @@ xfs_imap(
                }
                xfs_stack_trace();
 #endif /* DEBUG */
-               goto out_drop;
+               return error;
        }
 
        /*
@@ -2344,10 +2337,10 @@ xfs_imap(
         * in all cases where an untrusted inode number is passed.
         */
        if (flags & XFS_IGET_UNTRUSTED) {
-               error = xfs_imap_lookup(mp, tp, pag, agino, agbno,
+               error = xfs_imap_lookup(pag, tp, agino, agbno,
                                        &chunk_agbno, &offset_agbno, flags);
                if (error)
-                       goto out_drop;
+                       return error;
                goto out_map;
        }
 
@@ -2363,8 +2356,7 @@ xfs_imap(
                imap->im_len = XFS_FSB_TO_BB(mp, 1);
                imap->im_boffset = (unsigned short)(offset <<
                                                        mp->m_sb.sb_inodelog);
-               error = 0;
-               goto out_drop;
+               return 0;
        }
 
        /*
@@ -2376,10 +2368,10 @@ xfs_imap(
                offset_agbno = agbno & M_IGEO(mp)->inoalign_mask;
                chunk_agbno = agbno - offset_agbno;
        } else {
-               error = xfs_imap_lookup(mp, tp, pag, agino, agbno,
+               error = xfs_imap_lookup(pag, tp, agino, agbno,
                                        &chunk_agbno, &offset_agbno, flags);
                if (error)
-                       goto out_drop;
+                       return error;
        }
 
 out_map:
@@ -2407,14 +2399,9 @@ out_map:
                        __func__, (unsigned long long) imap->im_blkno,
                        (unsigned long long) imap->im_len,
                        XFS_FSB_TO_BB(mp, mp->m_sb.sb_dblocks));
-               error = -EINVAL;
-               goto out_drop;
+               return -EINVAL;
        }
-       error = 0;
-out_drop:
-       if (pag)
-               xfs_perag_put(pag);
-       return error;
+       return 0;
 }
 
 /*
index 9bbbca6ac4edf9c00ae5fc0dd53da51c72be775e..4cfce2eebe7e5176a2afa12ff9f57f9f0037ec56 100644 (file)
@@ -12,6 +12,7 @@ struct xfs_imap;
 struct xfs_mount;
 struct xfs_trans;
 struct xfs_btree_cur;
+struct xfs_perag;
 
 /* Move inodes in clusters of this size */
 #define        XFS_INODE_BIG_CLUSTER_SIZE      8192
@@ -47,7 +48,7 @@ int xfs_difree(struct xfs_trans *tp, struct xfs_perag *pag,
  */
 int
 xfs_imap(
-       struct xfs_mount *mp,           /* file system mount structure */
+       struct xfs_perag *pag,
        struct xfs_trans *tp,           /* transaction pointer */
        xfs_ino_t       ino,            /* inode to locate */
        struct xfs_imap *imap,          /* location map structure */
index 613260b04a3dc6dfcf268d599d8c2904d6a2832f..033bf6730ece76e61b6c59835ffb7dd714d22ffc 100644 (file)
@@ -636,6 +636,7 @@ xchk_get_inode(
 {
        struct xfs_imap         imap;
        struct xfs_mount        *mp = sc->mp;
+       struct xfs_perag        *pag;
        struct xfs_inode        *ip_in = XFS_I(file_inode(sc->file));
        struct xfs_inode        *ip = NULL;
        int                     error;
@@ -671,10 +672,14 @@ xchk_get_inode(
                 * Otherwise, we really couldn't find it so tell userspace
                 * that it no longer exists.
                 */
-               error = xfs_imap(sc->mp, sc->tp, sc->sm->sm_ino, &imap,
-                               XFS_IGET_UNTRUSTED | XFS_IGET_DONTCACHE);
-               if (error)
-                       return -ENOENT;
+               pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, sc->sm->sm_ino));
+               if (pag) {
+                       error = xfs_imap(pag, sc->tp, sc->sm->sm_ino, &imap,
+                                       XFS_IGET_UNTRUSTED | XFS_IGET_DONTCACHE);
+                       xfs_perag_put(pag);
+                       if (error)
+                               return -ENOENT;
+               }
                error = -EFSCORRUPTED;
                fallthrough;
        default:
index 8b2823d85a68c9945715c8a011f67e819879c38c..c9a7e270a4286b14471cfb679af950ca55c53622 100644 (file)
@@ -586,7 +586,7 @@ xfs_iget_cache_miss(
        if (!ip)
                return -ENOMEM;
 
-       error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, flags);
+       error = xfs_imap(pag, tp, ip->i_ino, &ip->i_imap, flags);
        if (error)
                goto out_destroy;