There is no reason to drop qi_dqlist_lock around calls to xfs_qm_dqrele
because the free list lock now nests inside qi_dqlist_lock and the
dquot lock.
Signed-off-by: Christoph Hellwig <[email protected]>
Reviewed-by: Dave Chinner <[email protected]>
Signed-off-by: Ben Myers <[email protected]>
{
struct xfs_quotainfo *q = mp->m_quotainfo;
struct xfs_dquot *dqp, *gdqp;
{
struct xfs_quotainfo *q = mp->m_quotainfo;
struct xfs_dquot *dqp, *gdqp;
again:
ASSERT(mutex_is_locked(&q->qi_dqlist_lock));
again:
ASSERT(mutex_is_locked(&q->qi_dqlist_lock));
mutex_lock(&q->qi_dqlist_lock);
goto again;
}
mutex_lock(&q->qi_dqlist_lock);
goto again;
}
- if ((gdqp = dqp->q_gdquot)) {
- xfs_dqlock(gdqp);
+
+ gdqp = dqp->q_gdquot;
+ if (gdqp)
- if (gdqp) {
- /*
- * Can't hold the mplist lock across a dqput.
- * XXXmust convert to marker based iterations here.
- */
- nrecl = q->qi_dqreclaims;
- mutex_unlock(&q->qi_dqlist_lock);
- xfs_qm_dqput(gdqp);
-
- mutex_lock(&q->qi_dqlist_lock);
- if (nrecl != q->qi_dqreclaims)
- goto again;
- }
+ if (gdqp)
+ xfs_qm_dqrele(gdqp);