Message ID | 20230118224505.1964941-10-david@fromorbit.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | xfs: per-ag centric allocation alogrithms | expand |
On Thu, Jan 19, 2023 at 09:44:32AM +1100, Dave Chinner wrote: > From: Dave Chinner <dchinner@redhat.com> > > 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> > --- > fs/xfs/libxfs/xfs_ialloc.c | 43 +++++++++++++------------------------- > fs/xfs/libxfs/xfs_ialloc.h | 3 ++- > fs/xfs/scrub/common.c | 13 ++++++++---- > fs/xfs/xfs_icache.c | 2 +- > 4 files changed, 27 insertions(+), 34 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c > index e8068422aa21..2b4961ff2e24 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.c > +++ b/fs/xfs/libxfs/xfs_ialloc.c > @@ -2217,15 +2217,15 @@ xfs_difree( > > 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_perag *pag, > struct xfs_trans *tp, /* transaction pointer */ Stupid nit: fix the extra space ^ problem here. Reviewed-by: Darrick J. Wong <djwong@kernel.org> --D > 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 @@ xfs_imap( > __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; > } > > /* > diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h > index 9bbbca6ac4ed..4cfce2eebe7e 100644 > --- a/fs/xfs/libxfs/xfs_ialloc.h > +++ b/fs/xfs/libxfs/xfs_ialloc.h > @@ -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 */ > diff --git a/fs/xfs/scrub/common.c b/fs/xfs/scrub/common.c > index 613260b04a3d..033bf6730ece 100644 > --- a/fs/xfs/scrub/common.c > +++ b/fs/xfs/scrub/common.c > @@ -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: > diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c > index 8b2823d85a68..c9a7e270a428 100644 > --- a/fs/xfs/xfs_icache.c > +++ b/fs/xfs/xfs_icache.c > @@ -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; > > -- > 2.39.0 >
diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c index e8068422aa21..2b4961ff2e24 100644 --- a/fs/xfs/libxfs/xfs_ialloc.c +++ b/fs/xfs/libxfs/xfs_ialloc.c @@ -2217,15 +2217,15 @@ xfs_difree( 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_perag *pag, struct xfs_trans *tp, /* transaction pointer */ 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 @@ xfs_imap( __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; } /* diff --git a/fs/xfs/libxfs/xfs_ialloc.h b/fs/xfs/libxfs/xfs_ialloc.h index 9bbbca6ac4ed..4cfce2eebe7e 100644 --- a/fs/xfs/libxfs/xfs_ialloc.h +++ b/fs/xfs/libxfs/xfs_ialloc.h @@ -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 */ diff --git a/fs/xfs/scrub/common.c b/fs/xfs/scrub/common.c index 613260b04a3d..033bf6730ece 100644 --- a/fs/xfs/scrub/common.c +++ b/fs/xfs/scrub/common.c @@ -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: diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 8b2823d85a68..c9a7e270a428 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -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;