xfs: Reference count per-ag structures
Reference count the per-ag structures to ensure that we keep get/put pairs balanced. Assert that the reference counts are zero at unmount time to catch leaks. In future, reference counts will enable us to safely remove perag structures by allowing us to detect when they are no longer in use. Signed-off-by: Dave Chinner <david@fromorbit.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Alex Elder <aelder@sgi.com>
This commit is contained in:
@@ -384,7 +384,7 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d)
|
||||
}
|
||||
|
||||
/*
|
||||
* perag get/put wrappers for eventual ref counting
|
||||
* perag get/put wrappers for ref counting
|
||||
*/
|
||||
static inline struct xfs_perag *
|
||||
xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno)
|
||||
@@ -393,6 +393,12 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno)
|
||||
|
||||
spin_lock(&mp->m_perag_lock);
|
||||
pag = radix_tree_lookup(&mp->m_perag_tree, agno);
|
||||
if (pag) {
|
||||
ASSERT(atomic_read(&pag->pag_ref) >= 0);
|
||||
/* catch leaks in the positive direction during testing */
|
||||
ASSERT(atomic_read(&pag->pag_ref) < 1000);
|
||||
atomic_inc(&pag->pag_ref);
|
||||
}
|
||||
spin_unlock(&mp->m_perag_lock);
|
||||
return pag;
|
||||
}
|
||||
@@ -400,7 +406,8 @@ xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno)
|
||||
static inline void
|
||||
xfs_perag_put(struct xfs_perag *pag)
|
||||
{
|
||||
/* nothing to see here, move along */
|
||||
ASSERT(atomic_read(&pag->pag_ref) > 0);
|
||||
atomic_dec(&pag->pag_ref);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user