From: Darrick J. Wong <djwong@xxxxxxxxxx> It turns out that there is a 1:1 mapping between the execute and tag parameters that are passed to xfs_inode_walk_ag: xfs_dqrele_inode => XFS_ICI_NO_TAG xfs_blockgc_scan_inode => XFS_ICI_BLOCKGC_TAG The radix tree tags are an implementation detail of the inode cache, which means that callers outside of xfs_icache.c have no business passing in radix tree tags. Since we're about to get rid of the indirect calls in the BLOCKGC case, eliminate the extra argument in favor of computing the ICI tag from the execute argument passed into the function. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- fs/xfs/xfs_icache.c | 27 ++++++++++++++++++--------- fs/xfs/xfs_icache.h | 2 +- fs/xfs/xfs_qm_syscalls.c | 3 +-- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 7353c9fe05db..6924125a3c53 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -26,6 +26,9 @@ #include <linux/iversion.h> +/* Forward declarations to reduce indirect calls in xfs_inode_walk_ag */ +static int xfs_blockgc_scan_inode(struct xfs_inode *ip, void *args); + /* * Allocate and initialise an xfs_inode. */ @@ -763,6 +766,14 @@ xfs_inode_walk_ag_grab( return false; } +static inline int +inode_walk_fn_to_tag(int (*execute)(struct xfs_inode *ip, void *args)) +{ + if (execute == xfs_blockgc_scan_inode) + return XFS_ICI_BLOCKGC_TAG; + return XFS_ICI_NO_TAG; +} + /* * For a given per-AG structure @pag, grab, @execute, and rele all incore * inodes with the given radix tree @tag. @@ -772,14 +783,14 @@ xfs_inode_walk_ag( struct xfs_perag *pag, int iter_flags, int (*execute)(struct xfs_inode *ip, void *args), - void *args, - int tag) + void *args) { struct xfs_mount *mp = pag->pag_mount; uint32_t first_index; int last_error = 0; int skipped; bool done; + int tag = inode_walk_fn_to_tag(execute); int nr_found; restart: @@ -893,18 +904,18 @@ xfs_inode_walk( struct xfs_mount *mp, int iter_flags, int (*execute)(struct xfs_inode *ip, void *args), - void *args, - int tag) + void *args) { struct xfs_perag *pag; int error = 0; int last_error = 0; + int tag = inode_walk_fn_to_tag(execute); xfs_agnumber_t ag; ag = 0; while ((pag = xfs_inode_walk_get_perag(mp, ag, tag))) { ag = pag->pag_agno + 1; - error = xfs_inode_walk_ag(pag, iter_flags, execute, args, tag); + error = xfs_inode_walk_ag(pag, iter_flags, execute, args); xfs_perag_put(pag); if (error) { last_error = error; @@ -1613,8 +1624,7 @@ xfs_blockgc_worker( if (!sb_start_write_trylock(mp->m_super)) return; - error = xfs_inode_walk_ag(pag, 0, xfs_blockgc_scan_inode, NULL, - XFS_ICI_BLOCKGC_TAG); + error = xfs_inode_walk_ag(pag, 0, xfs_blockgc_scan_inode, NULL); if (error) xfs_info(mp, "AG %u preallocation gc worker failed, err=%d", pag->pag_agno, error); @@ -1632,8 +1642,7 @@ xfs_blockgc_free_space( { trace_xfs_blockgc_free_space(mp, eofb, _RET_IP_); - return xfs_inode_walk(mp, 0, xfs_blockgc_scan_inode, eofb, - XFS_ICI_BLOCKGC_TAG); + return xfs_inode_walk(mp, 0, xfs_blockgc_scan_inode, eofb); } /* diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index d1fddb152420..a20bb89e3a38 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -70,7 +70,7 @@ void xfs_blockgc_worker(struct work_struct *work); int xfs_inode_walk(struct xfs_mount *mp, int iter_flags, int (*execute)(struct xfs_inode *ip, void *args), - void *args, int tag); + void *args); int xfs_icache_inode_is_allocated(struct xfs_mount *mp, struct xfs_trans *tp, xfs_ino_t ino, bool *inuse); diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index ca1b57d291dc..2f42ea8a09ab 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -795,6 +795,5 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_walk(mp, XFS_INODE_WALK_INEW_WAIT, xfs_dqrele_inode, - &flags, XFS_ICI_NO_TAG); + xfs_inode_walk(mp, XFS_INODE_WALK_INEW_WAIT, xfs_dqrele_inode, &flags); }