xfs: add helper to conditionally remove items from the AIL

Several areas of code duplicate a pattern where we take the AIL lock,
check whether an item is in the AIL and remove it if so. Create a new
helper for this pattern and use it where appropriate.

Signed-off-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
Brian Foster 2015-08-19 10:01:08 +10:00 committed by Dave Chinner
parent f307080a62
commit 146e54b71e
5 changed files with 21 additions and 33 deletions

View File

@ -647,11 +647,7 @@ xfs_buf_item_unlock(
xfs_buf_item_relse(bp); xfs_buf_item_relse(bp);
else if (aborted) { else if (aborted) {
ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp)); ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp));
if (lip->li_flags & XFS_LI_IN_AIL) { xfs_trans_ail_remove(lip, SHUTDOWN_LOG_IO_ERROR);
spin_lock(&lip->li_ailp->xa_lock);
xfs_trans_ail_delete(lip->li_ailp, lip,
SHUTDOWN_LOG_IO_ERROR);
}
xfs_buf_item_relse(bp); xfs_buf_item_relse(bp);
} }
} }

View File

@ -954,12 +954,8 @@ xfs_qm_dqflush(
struct xfs_log_item *lip = &dqp->q_logitem.qli_item; struct xfs_log_item *lip = &dqp->q_logitem.qli_item;
dqp->dq_flags &= ~XFS_DQ_DIRTY; dqp->dq_flags &= ~XFS_DQ_DIRTY;
spin_lock(&mp->m_ail->xa_lock); xfs_trans_ail_remove(lip, SHUTDOWN_CORRUPT_INCORE);
if (lip->li_flags & XFS_LI_IN_AIL)
xfs_trans_ail_delete(mp->m_ail, lip,
SHUTDOWN_CORRUPT_INCORE);
else
spin_unlock(&mp->m_ail->xa_lock);
error = -EIO; error = -EIO;
goto out_unlock; goto out_unlock;
} }

View File

@ -286,20 +286,8 @@ void
xfs_efi_release( xfs_efi_release(
struct xfs_efi_log_item *efip) struct xfs_efi_log_item *efip)
{ {
struct xfs_ail *ailp = efip->efi_item.li_ailp;
if (atomic_dec_and_test(&efip->efi_refcount)) { if (atomic_dec_and_test(&efip->efi_refcount)) {
spin_lock(&ailp->xa_lock); xfs_trans_ail_remove(&efip->efi_item, SHUTDOWN_LOG_IO_ERROR);
/*
* We don't know whether the EFI made it to the AIL. Remove it
* if so. Note that xfs_trans_ail_delete() drops the AIL lock.
*/
if (efip->efi_item.li_flags & XFS_LI_IN_AIL)
xfs_trans_ail_delete(ailp, &efip->efi_item,
SHUTDOWN_LOG_IO_ERROR);
else
spin_unlock(&ailp->xa_lock);
xfs_efi_item_free(efip); xfs_efi_item_free(efip);
} }
} }

View File

@ -703,17 +703,10 @@ xfs_iflush_abort(
xfs_inode_log_item_t *iip = ip->i_itemp; xfs_inode_log_item_t *iip = ip->i_itemp;
if (iip) { if (iip) {
struct xfs_ail *ailp = iip->ili_item.li_ailp;
if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { if (iip->ili_item.li_flags & XFS_LI_IN_AIL) {
spin_lock(&ailp->xa_lock); xfs_trans_ail_remove(&iip->ili_item,
if (iip->ili_item.li_flags & XFS_LI_IN_AIL) { stale ? SHUTDOWN_LOG_IO_ERROR :
/* xfs_trans_ail_delete() drops the AIL lock. */
xfs_trans_ail_delete(ailp, &iip->ili_item,
stale ?
SHUTDOWN_LOG_IO_ERROR :
SHUTDOWN_CORRUPT_INCORE); SHUTDOWN_CORRUPT_INCORE);
} else
spin_unlock(&ailp->xa_lock);
} }
iip->ili_logged = 0; iip->ili_logged = 0;
/* /*

View File

@ -119,6 +119,21 @@ xfs_trans_ail_delete(
xfs_trans_ail_delete_bulk(ailp, &lip, 1, shutdown_type); xfs_trans_ail_delete_bulk(ailp, &lip, 1, shutdown_type);
} }
static inline void
xfs_trans_ail_remove(
struct xfs_log_item *lip,
int shutdown_type)
{
struct xfs_ail *ailp = lip->li_ailp;
spin_lock(&ailp->xa_lock);
/* xfs_trans_ail_delete() drops the AIL lock */
if (lip->li_flags & XFS_LI_IN_AIL)
xfs_trans_ail_delete(ailp, lip, shutdown_type);
else
spin_unlock(&ailp->xa_lock);
}
void xfs_ail_push(struct xfs_ail *, xfs_lsn_t); void xfs_ail_push(struct xfs_ail *, xfs_lsn_t);
void xfs_ail_push_all(struct xfs_ail *); void xfs_ail_push_all(struct xfs_ail *);
void xfs_ail_push_all_sync(struct xfs_ail *); void xfs_ail_push_all_sync(struct xfs_ail *);