]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: convert xfs_imap() to take a perag
authorDave Chinner <dchinner@redhat.com>
Tue, 9 May 2023 09:29:43 +0000 (11:29 +0200)
committerCarlos Maiolino <cem@kernel.org>
Wed, 10 May 2023 06:26:29 +0000 (08:26 +0200)
Source kernel commit: 498f0adbcdb6a68403bfb9645a7555b789a7fee4

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>
Signed-off-by: Carlos Maiolino <cem@kernel.org>
libxfs/rdwr.c
libxfs/xfs_ialloc.c
libxfs/xfs_ialloc.h

index d5aad3ea210514f3087304f977e49e7f9aebe1b0..ccd1501ab39eaf15474ca31158fb08a74c6e4321 100644 (file)
@@ -1085,8 +1085,13 @@ libxfs_iget(
 {
        struct xfs_inode        *ip;
        struct xfs_buf          *bp;
+       struct xfs_perag        *pag;
        int                     error = 0;
 
+       /* reject inode numbers outside existing AGs */
+       if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount)
+               return -EINVAL;
+
        ip = kmem_cache_zalloc(xfs_inode_cache, 0);
        if (!ip)
                return -ENOMEM;
@@ -1097,7 +1102,10 @@ libxfs_iget(
        ip->i_af.if_format = XFS_DINODE_FMT_EXTENTS;
        spin_lock_init(&VFS_I(ip)->i_lock);
 
-       error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, 0);
+       pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino));
+       error = xfs_imap(pag, tp, ip->i_ino, &ip->i_imap, 0);
+       xfs_perag_put(pag);
+
        if (error)
                goto out_destroy;
 
index 998a7adbcac8455a6bb5c945c0abd46c398db135..d617d8538b3faa409cf1cb74b3894b5cebf778c6 100644 (file)
@@ -2212,15 +2212,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;
@@ -2275,12 +2275,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 */
@@ -2288,17 +2289,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
@@ -2307,20 +2306,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,
@@ -2328,7 +2321,7 @@ xfs_imap(
                }
                xfs_stack_trace();
 #endif /* DEBUG */
-               goto out_drop;
+               return error;
        }
 
        /*
@@ -2339,10 +2332,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;
        }
 
@@ -2358,8 +2351,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;
        }
 
        /*
@@ -2371,10 +2363,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:
@@ -2402,14 +2394,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 */