/* * 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) { unsigned long s; xfs_dquot_t *dqp; dqp = logitem->qli_dquot; ASSERT(XFS_DQ_IS_LOCKED(dqp)); s = XFS_DQ_PINLOCK(dqp); dqp->q_pincount++; XFS_DQ_PINUNLOCK(dqp, s); }
/* * 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(). */ STATIC void xfs_qm_dquot_logitem_unpin( xfs_dq_logitem_t *logitem) { int s; xfs_dquot_t *dqp; dqp = logitem->qli_dquot; ASSERT(dqp->q_pincount > 0); s = XFS_DQ_PINLOCK(dqp); dqp->q_pincount--; if (dqp->q_pincount == 0) { sv_broadcast(&dqp->q_pinwait); } XFS_DQ_PINUNLOCK(dqp, s); }
/* * This is called to wait for the given dquot to be unpinned. * Most of these pin/unpin routines are plagiarized from inode code. */ void xfs_qm_dqunpin_wait( xfs_dquot_t *dqp) { SPLDECL(s); ASSERT(XFS_DQ_IS_LOCKED(dqp)); if (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); s = XFS_DQ_PINLOCK(dqp); if (dqp->q_pincount == 0) { XFS_DQ_PINUNLOCK(dqp, s); return; } sv_wait(&(dqp->q_pinwait), PINOD, &(XFS_DQ_TO_QINF(dqp)->qi_pinlock), s); }