mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 22:54:05 +08:00
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:
parent
f307080a62
commit
146e54b71e
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
/*
|
/*
|
||||||
|
@ -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 *);
|
||||||
|
Loading…
Reference in New Issue
Block a user