On Tue, Feb 14, 2012 at 09:29:28PM -0500, Christoph Hellwig wrote:
> Replace the global hash tables for looking up in-memory dquot structures
> with per-filesystem radix trees to allow scaling to a large number of
> in-memory dquot structures.
And simplifies the code a lot. Only minor comments about using
local quotainfo variables below.
> @@ -1593,10 +1515,10 @@ xfs_qm_dqfree_one(
> struct xfs_mount *mp = dqp->q_mount;
> struct xfs_quotainfo *qi = mp->m_quotainfo;
>
> - mutex_lock(&dqp->q_hash->qh_lock);
> - list_del_init(&dqp->q_hashlist);
> - dqp->q_hash->qh_version++;
> - mutex_unlock(&dqp->q_hash->qh_lock);
> + mutex_lock(&mp->m_quotainfo->qi_tree_lock);
> + radix_tree_delete(XFS_DQUOT_TREE(mp, dqp->q_core.d_flags),
> + be32_to_cpu(dqp->q_core.d_id));
> + mutex_unlock(&mp->m_quotainfo->qi_tree_lock);
qi->qi_tree_lock, as the local variable is already set up.
> @@ -672,10 +618,9 @@ xfs_qm_dqget(
> uint flags, /* DQALLOC, DQSUSER, DQREPAIR, DOWARN */
> xfs_dquot_t **O_dqpp) /* OUT : locked incore dquot */
> {
> - xfs_dquot_t *dqp, *dqp1;
> - xfs_dqhash_t *h;
> - uint version;
> - int error;
> + struct radix_tree_root *tree = XFS_DQUOT_TREE(mp, type);
> + struct xfs_dquot *dqp;
> + int error;
Add a quotainfo local variable and use it in the function?
> @@ -1171,10 +1078,10 @@ xfs_qm_dqpurge(
> xfs_dqfunlock(dqp);
> xfs_dqunlock(dqp);
>
> - mutex_lock(&qh->qh_lock);
> - list_del_init(&dqp->q_hashlist);
> - qh->qh_version++;
> - mutex_unlock(&qh->qh_lock);
> + mutex_lock(&mp->m_quotainfo->qi_tree_lock);
> + radix_tree_delete(XFS_DQUOT_TREE(mp, dqp->q_core.d_flags),
> + be32_to_cpu(dqp->q_core.d_id));
> + mutex_unlock(&mp->m_quotainfo->qi_tree_lock);
qi->qi_tree_lock as it is already there and used for all the other
quotainfo references.
Otherwise looks good.
Reviewed-by: Dave Chinner <dchinner@xxxxxxxxxx>
--
Dave Chinner
david@xxxxxxxxxxxxx
|