xfs: split xfs_imap_to_bp
authorChristoph Hellwig <hch@lst.de>
Mon, 29 Mar 2021 18:11:37 +0000 (11:11 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 7 Apr 2021 21:37:02 +0000 (14:37 -0700)
Split looking up the dinode from xfs_imap_to_bp, which can be
significantly simplified as a result.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/libxfs/xfs_inode_buf.c
fs/xfs/libxfs/xfs_inode_buf.h
fs/xfs/libxfs/xfs_trans_inode.c
fs/xfs/scrub/ialloc.c
fs/xfs/xfs_icache.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_log_recover.c

index 4d7410e..af5ee8b 100644 (file)
@@ -124,37 +124,18 @@ const struct xfs_buf_ops xfs_inode_buf_ra_ops = {
 /*
  * This routine is called to map an inode to the buffer containing the on-disk
  * version of the inode.  It returns a pointer to the buffer containing the
- * on-disk inode in the bpp parameter, and in the dipp parameter it returns a
- * pointer to the on-disk inode within that buffer.
- *
- * If a non-zero error is returned, then the contents of bpp and dipp are
- * undefined.
+ * on-disk inode in the bpp parameter.
  */
 int
 xfs_imap_to_bp(
        struct xfs_mount        *mp,
        struct xfs_trans        *tp,
        struct xfs_imap         *imap,
-       struct xfs_dinode       **dipp,
-       struct xfs_buf          **bpp,
-       uint                    buf_flags)
+       struct xfs_buf          **bpp)
 {
-       struct xfs_buf          *bp;
-       int                     error;
-
-       buf_flags |= XBF_UNMAPPED;
-       error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno,
-                                  (int)imap->im_len, buf_flags, &bp,
+       return xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno,
+                                  imap->im_len, XBF_UNMAPPED, bpp,
                                   &xfs_inode_buf_ops);
-       if (error) {
-               ASSERT(error != -EAGAIN || (buf_flags & XBF_TRYLOCK));
-               return error;
-       }
-
-       *bpp = bp;
-       if (dipp)
-               *dipp = xfs_buf_offset(bp, imap->im_boffset);
-       return 0;
 }
 
 static inline struct timespec64 xfs_inode_decode_bigtime(uint64_t ts)
index ef5eaf3..9e1ae38 100644 (file)
@@ -47,9 +47,8 @@ struct xfs_imap {
        unsigned short  im_boffset;     /* inode offset in block in bytes */
 };
 
-int    xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,
-                      struct xfs_imap *, struct xfs_dinode **,
-                      struct xfs_buf **, uint);
+int    xfs_imap_to_bp(struct xfs_mount *mp, struct xfs_trans *tp,
+                      struct xfs_imap *imap, struct xfs_buf **bpp);
 void   xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *);
 void   xfs_inode_to_disk(struct xfs_inode *ip, struct xfs_dinode *to,
                          xfs_lsn_t lsn);
index 90f1d56..4f02cb4 100644 (file)
@@ -164,8 +164,7 @@ xfs_trans_log_inode(
                 * here.
                 */
                spin_unlock(&iip->ili_lock);
-               error = xfs_imap_to_bp(ip->i_mount, tp, &ip->i_imap, NULL,
-                                       &bp, 0);
+               error = xfs_imap_to_bp(ip->i_mount, tp, &ip->i_imap, &bp);
                if (error) {
                        xfs_force_shutdown(ip->i_mount, SHUTDOWN_META_IO_ERROR);
                        return;
index 6517d67..1644199 100644 (file)
@@ -212,7 +212,6 @@ xchk_iallocbt_check_cluster(
 {
        struct xfs_imap                 imap;
        struct xfs_mount                *mp = bs->cur->bc_mp;
-       struct xfs_dinode               *dip;
        struct xfs_buf                  *cluster_bp;
        unsigned int                    nr_inodes;
        xfs_agnumber_t                  agno = bs->cur->bc_ag.agno;
@@ -278,7 +277,7 @@ xchk_iallocbt_check_cluster(
                        &XFS_RMAP_OINFO_INODES);
 
        /* Grab the inode cluster buffer. */
-       error = xfs_imap_to_bp(mp, bs->cur->bc_tp, &imap, &dip, &cluster_bp, 0);
+       error = xfs_imap_to_bp(mp, bs->cur->bc_tp, &imap, &cluster_bp);
        if (!xchk_btree_xref_process_error(bs->sc, bs->cur, 0, &error))
                return error;
 
index e6a62f7..248c42b 100644 (file)
@@ -505,14 +505,14 @@ xfs_iget_cache_miss(
            (flags & XFS_IGET_CREATE) && !(mp->m_flags & XFS_MOUNT_IKEEP)) {
                VFS_I(ip)->i_generation = prandom_u32();
        } else {
-               struct xfs_dinode       *dip;
                struct xfs_buf          *bp;
 
-               error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0);
+               error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp);
                if (error)
                        goto out_destroy;
 
-               error = xfs_inode_from_disk(ip, dip);
+               error = xfs_inode_from_disk(ip,
+                               xfs_buf_offset(bp, ip->i_imap.im_boffset));
                if (!error)
                        xfs_buf_set_ref(bp, XFS_INO_REF);
                xfs_trans_brelse(tp, bp);
index c09bb39..8983ef0 100644 (file)
@@ -2075,9 +2075,10 @@ xfs_iunlink_update_inode(
 
        ASSERT(xfs_verify_agino_or_null(mp, agno, next_agino));
 
-       error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp, 0);
+       error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &ibp);
        if (error)
                return error;
+       dip = xfs_buf_offset(ibp, ip->i_imap.im_boffset);
 
        /* Make sure the old pointer isn't garbage. */
        old_value = be32_to_cpu(dip->di_next_unlinked);
@@ -2202,13 +2203,14 @@ xfs_iunlink_map_ino(
                return error;
        }
 
-       error = xfs_imap_to_bp(mp, tp, imap, dipp, bpp, 0);
+       error = xfs_imap_to_bp(mp, tp, imap, bpp);
        if (error) {
                xfs_warn(mp, "%s: xfs_imap_to_bp returned error %d.",
                                __func__, error);
                return error;
        }
 
+       *dipp = xfs_buf_offset(*bpp, imap->im_boffset);
        return 0;
 }
 
index ffa4f6f..42a8c7d 100644 (file)
@@ -2683,9 +2683,10 @@ xlog_recover_process_one_iunlink(
        /*
         * Get the on disk inode to find the next inode in the bucket.
         */
-       error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &ibp, 0);
+       error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &ibp);
        if (error)
                goto fail_iput;
+       dip = xfs_buf_offset(ibp, ip->i_imap.im_boffset);
 
        xfs_iflags_clear(ip, XFS_IRECOVERY);
        ASSERT(VFS_I(ip)->i_nlink == 0);