diff options
Diffstat (limited to 'fs/xfs/xfs_mount.c')
| -rw-r--r-- | fs/xfs/xfs_mount.c | 34 | 
1 files changed, 34 insertions, 0 deletions
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index f241fec2607..049dbc71c28 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -201,6 +201,38 @@ xfs_uuid_unmount(  /* + * Reference counting access wrappers to the perag structures. + */ +struct xfs_perag * +xfs_perag_get(struct xfs_mount *mp, xfs_agnumber_t agno) +{ +	struct xfs_perag	*pag; +	int			ref = 0; + +	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); +		ref = atomic_inc_return(&pag->pag_ref); +	} +	spin_unlock(&mp->m_perag_lock); +	trace_xfs_perag_get(mp, agno, ref, _RET_IP_); +	return pag; +} + +void +xfs_perag_put(struct xfs_perag *pag) +{ +	int	ref; + +	ASSERT(atomic_read(&pag->pag_ref) > 0); +	ref = atomic_dec_return(&pag->pag_ref); +	trace_xfs_perag_put(pag->pag_mount, pag->pag_agno, ref, _RET_IP_); +} + +/*   * Free up the resources associated with a mount structure.  Assume that   * the structure was initially zeroed, so we can tell which fields got   * initialized. @@ -433,6 +465,8 @@ xfs_initialize_perag(  			kmem_free(pag);  			return -EEXIST;  		} +		pag->pag_agno = index; +		pag->pag_mount = mp;  		spin_unlock(&mp->m_perag_lock);  		radix_tree_preload_end();  	}  |