mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
xfs: merge the perag freeing helpers
There is no good reason to have two different routines for freeing perag structures for the unmount and error cases. Add two arguments to specify the range of AGs to free to xfs_free_perag, and use that to replace xfs_free_unused_perag_range. The addition RCU grace period for the error case is harmless, and the extra check for the AG to actually exist is not required now that the callers pass the exact known allocated range. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org>
This commit is contained in:
parent
82742f8c3f
commit
aa67ec6a25
@ -185,17 +185,20 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free up the per-ag resources associated with the mount structure.
|
* Free up the per-ag resources within the specified AG range.
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
xfs_free_perag(
|
xfs_free_perag_range(
|
||||||
struct xfs_mount *mp)
|
struct xfs_mount *mp,
|
||||||
|
xfs_agnumber_t first_agno,
|
||||||
|
xfs_agnumber_t end_agno)
|
||||||
|
|
||||||
{
|
{
|
||||||
struct xfs_perag *pag;
|
|
||||||
xfs_agnumber_t agno;
|
xfs_agnumber_t agno;
|
||||||
|
|
||||||
for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
|
for (agno = first_agno; agno < end_agno; agno++) {
|
||||||
pag = xa_erase(&mp->m_perags, agno);
|
struct xfs_perag *pag = xa_erase(&mp->m_perags, agno);
|
||||||
|
|
||||||
ASSERT(pag);
|
ASSERT(pag);
|
||||||
XFS_IS_CORRUPT(pag->pag_mount, atomic_read(&pag->pag_ref) != 0);
|
XFS_IS_CORRUPT(pag->pag_mount, atomic_read(&pag->pag_ref) != 0);
|
||||||
xfs_defer_drain_free(&pag->pag_intents_drain);
|
xfs_defer_drain_free(&pag->pag_intents_drain);
|
||||||
@ -270,29 +273,6 @@ xfs_agino_range(
|
|||||||
return __xfs_agino_range(mp, xfs_ag_block_count(mp, agno), first, last);
|
return __xfs_agino_range(mp, xfs_ag_block_count(mp, agno), first, last);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Free perag within the specified AG range, it is only used to free unused
|
|
||||||
* perags under the error handling path.
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
xfs_free_unused_perag_range(
|
|
||||||
struct xfs_mount *mp,
|
|
||||||
xfs_agnumber_t agstart,
|
|
||||||
xfs_agnumber_t agend)
|
|
||||||
{
|
|
||||||
struct xfs_perag *pag;
|
|
||||||
xfs_agnumber_t index;
|
|
||||||
|
|
||||||
for (index = agstart; index < agend; index++) {
|
|
||||||
pag = xa_erase(&mp->m_perags, index);
|
|
||||||
if (!pag)
|
|
||||||
break;
|
|
||||||
xfs_buf_cache_destroy(&pag->pag_bcache);
|
|
||||||
xfs_defer_drain_free(&pag->pag_intents_drain);
|
|
||||||
kfree(pag);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
xfs_initialize_perag(
|
xfs_initialize_perag(
|
||||||
struct xfs_mount *mp,
|
struct xfs_mount *mp,
|
||||||
@ -366,7 +346,7 @@ out_remove_pag:
|
|||||||
out_free_pag:
|
out_free_pag:
|
||||||
kfree(pag);
|
kfree(pag);
|
||||||
out_unwind_new_pags:
|
out_unwind_new_pags:
|
||||||
xfs_free_unused_perag_range(mp, old_agcount, index);
|
xfs_free_perag_range(mp, old_agcount, index);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,13 +144,12 @@ __XFS_AG_OPSTATE(prefers_metadata, PREFERS_METADATA)
|
|||||||
__XFS_AG_OPSTATE(allows_inodes, ALLOWS_INODES)
|
__XFS_AG_OPSTATE(allows_inodes, ALLOWS_INODES)
|
||||||
__XFS_AG_OPSTATE(agfl_needs_reset, AGFL_NEEDS_RESET)
|
__XFS_AG_OPSTATE(agfl_needs_reset, AGFL_NEEDS_RESET)
|
||||||
|
|
||||||
void xfs_free_unused_perag_range(struct xfs_mount *mp, xfs_agnumber_t agstart,
|
|
||||||
xfs_agnumber_t agend);
|
|
||||||
int xfs_initialize_perag(struct xfs_mount *mp, xfs_agnumber_t old_agcount,
|
int xfs_initialize_perag(struct xfs_mount *mp, xfs_agnumber_t old_agcount,
|
||||||
xfs_agnumber_t agcount, xfs_rfsblock_t dcount,
|
xfs_agnumber_t agcount, xfs_rfsblock_t dcount,
|
||||||
xfs_agnumber_t *maxagi);
|
xfs_agnumber_t *maxagi);
|
||||||
|
void xfs_free_perag_range(struct xfs_mount *mp, xfs_agnumber_t first_agno,
|
||||||
|
xfs_agnumber_t end_agno);
|
||||||
int xfs_initialize_perag_data(struct xfs_mount *mp, xfs_agnumber_t agno);
|
int xfs_initialize_perag_data(struct xfs_mount *mp, xfs_agnumber_t agno);
|
||||||
void xfs_free_perag(struct xfs_mount *mp);
|
|
||||||
|
|
||||||
/* Passive AG references */
|
/* Passive AG references */
|
||||||
struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno);
|
struct xfs_perag *xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno);
|
||||||
|
@ -229,7 +229,7 @@ out_trans_cancel:
|
|||||||
xfs_trans_cancel(tp);
|
xfs_trans_cancel(tp);
|
||||||
out_free_unused_perag:
|
out_free_unused_perag:
|
||||||
if (nagcount > oagcount)
|
if (nagcount > oagcount)
|
||||||
xfs_free_unused_perag_range(mp, oagcount, nagcount);
|
xfs_free_perag_range(mp, oagcount, nagcount);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1048,7 +1048,7 @@ xfs_mountfs(
|
|||||||
xfs_buftarg_drain(mp->m_logdev_targp);
|
xfs_buftarg_drain(mp->m_logdev_targp);
|
||||||
xfs_buftarg_drain(mp->m_ddev_targp);
|
xfs_buftarg_drain(mp->m_ddev_targp);
|
||||||
out_free_perag:
|
out_free_perag:
|
||||||
xfs_free_perag(mp);
|
xfs_free_perag_range(mp, 0, mp->m_sb.sb_agcount);
|
||||||
out_free_dir:
|
out_free_dir:
|
||||||
xfs_da_unmount(mp);
|
xfs_da_unmount(mp);
|
||||||
out_remove_uuid:
|
out_remove_uuid:
|
||||||
@ -1129,8 +1129,7 @@ xfs_unmountfs(
|
|||||||
xfs_errortag_clearall(mp);
|
xfs_errortag_clearall(mp);
|
||||||
#endif
|
#endif
|
||||||
shrinker_free(mp->m_inodegc_shrinker);
|
shrinker_free(mp->m_inodegc_shrinker);
|
||||||
xfs_free_perag(mp);
|
xfs_free_perag_range(mp, 0, mp->m_sb.sb_agcount);
|
||||||
|
|
||||||
xfs_errortag_del(mp);
|
xfs_errortag_del(mp);
|
||||||
xfs_error_sysfs_del(mp);
|
xfs_error_sysfs_del(mp);
|
||||||
xchk_stats_unregister(mp->m_scrub_stats);
|
xchk_stats_unregister(mp->m_scrub_stats);
|
||||||
|
Loading…
Reference in New Issue
Block a user