|
@@ -88,25 +88,22 @@ xfs_qm_dquot_logitem_format(
|
|
|
|
|
|
/*
|
|
|
* Increment the pin count of the given dquot.
|
|
|
- * This value is protected by pinlock spinlock in the xQM structure.
|
|
|
*/
|
|
|
STATIC void
|
|
|
xfs_qm_dquot_logitem_pin(
|
|
|
xfs_dq_logitem_t *logitem)
|
|
|
{
|
|
|
- xfs_dquot_t *dqp;
|
|
|
+ xfs_dquot_t *dqp = logitem->qli_dquot;
|
|
|
|
|
|
- dqp = logitem->qli_dquot;
|
|
|
ASSERT(XFS_DQ_IS_LOCKED(dqp));
|
|
|
- spin_lock(&(XFS_DQ_TO_QINF(dqp)->qi_pinlock));
|
|
|
- dqp->q_pincount++;
|
|
|
- spin_unlock(&(XFS_DQ_TO_QINF(dqp)->qi_pinlock));
|
|
|
+ atomic_inc(dqp->q_pincount);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* Decrement the pin count of the given dquot, and wake up
|
|
|
* anyone in xfs_dqwait_unpin() if the count goes to 0. The
|
|
|
- * dquot must have been previously pinned with a call to xfs_dqpin().
|
|
|
+ * dquot must have been previously pinned with a call to
|
|
|
+ * xfs_qm_dquot_logitem_pin().
|
|
|
*/
|
|
|
/* ARGSUSED */
|
|
|
STATIC void
|
|
@@ -114,16 +111,11 @@ xfs_qm_dquot_logitem_unpin(
|
|
|
xfs_dq_logitem_t *logitem,
|
|
|
int stale)
|
|
|
{
|
|
|
- xfs_dquot_t *dqp;
|
|
|
+ xfs_dquot_t *dqp = logitem->qli_dquot;
|
|
|
|
|
|
- dqp = logitem->qli_dquot;
|
|
|
- ASSERT(dqp->q_pincount > 0);
|
|
|
- spin_lock(&(XFS_DQ_TO_QINF(dqp)->qi_pinlock));
|
|
|
- dqp->q_pincount--;
|
|
|
- if (dqp->q_pincount == 0) {
|
|
|
- sv_broadcast(&dqp->q_pinwait);
|
|
|
- }
|
|
|
- spin_unlock(&(XFS_DQ_TO_QINF(dqp)->qi_pinlock));
|
|
|
+ ASSERT(atomic_read(&dqp->q_pincount) > 0);
|
|
|
+ if (atomic_dec_and_test(&dqp->q_pincount))
|
|
|
+ wake_up(&dqp->q_pinwait);
|
|
|
}
|
|
|
|
|
|
/* ARGSUSED */
|
|
@@ -193,21 +185,14 @@ xfs_qm_dqunpin_wait(
|
|
|
xfs_dquot_t *dqp)
|
|
|
{
|
|
|
ASSERT(XFS_DQ_IS_LOCKED(dqp));
|
|
|
- if (dqp->q_pincount == 0) {
|
|
|
+ if (atomic_read(&dqp->q_pincount) == 0)
|
|
|
return;
|
|
|
- }
|
|
|
|
|
|
/*
|
|
|
* Give the log a push so we don't wait here too long.
|
|
|
*/
|
|
|
xfs_log_force(dqp->q_mount, (xfs_lsn_t)0, XFS_LOG_FORCE);
|
|
|
- spin_lock(&(XFS_DQ_TO_QINF(dqp)->qi_pinlock));
|
|
|
- if (dqp->q_pincount == 0) {
|
|
|
- spin_unlock(&(XFS_DQ_TO_QINF(dqp)->qi_pinlock));
|
|
|
- return;
|
|
|
- }
|
|
|
- sv_wait(&(dqp->q_pinwait), PINOD,
|
|
|
- &(XFS_DQ_TO_QINF(dqp)->qi_pinlock), s);
|
|
|
+ wait_event(dqp->q_pinwait, (atomic_read(&dqp->q_pincount) == 0));
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -310,7 +295,7 @@ xfs_qm_dquot_logitem_trylock(
|
|
|
uint retval;
|
|
|
|
|
|
dqp = qip->qli_dquot;
|
|
|
- if (dqp->q_pincount > 0)
|
|
|
+ if (atomic_read(&dqp->q_pincount) > 0)
|
|
|
return (XFS_ITEM_PINNED);
|
|
|
|
|
|
if (! xfs_qm_dqlock_nowait(dqp))
|