Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 146e54b7 authored by Brian Foster's avatar Brian Foster Committed by Dave Chinner
Browse files

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: default avatarBrian Foster <bfoster@redhat.com>
parent f307080a
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -647,11 +647,7 @@ xfs_buf_item_unlock(
			xfs_buf_item_relse(bp);
		else if (aborted) {
			ASSERT(XFS_FORCED_SHUTDOWN(lip->li_mountp));
			if (lip->li_flags & XFS_LI_IN_AIL) {
				spin_lock(&lip->li_ailp->xa_lock);
				xfs_trans_ail_delete(lip->li_ailp, lip,
						     SHUTDOWN_LOG_IO_ERROR);
			}
			xfs_trans_ail_remove(lip, SHUTDOWN_LOG_IO_ERROR);
			xfs_buf_item_relse(bp);
		}
	}
+2 −6
Original line number Diff line number Diff line
@@ -954,12 +954,8 @@ xfs_qm_dqflush(
		struct xfs_log_item	*lip = &dqp->q_logitem.qli_item;
		dqp->dq_flags &= ~XFS_DQ_DIRTY;

		spin_lock(&mp->m_ail->xa_lock);
		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);
		xfs_trans_ail_remove(lip, SHUTDOWN_CORRUPT_INCORE);

		error = -EIO;
		goto out_unlock;
	}
+1 −13
Original line number Diff line number Diff line
@@ -286,20 +286,8 @@ void
xfs_efi_release(
	struct xfs_efi_log_item	*efip)
{
	struct xfs_ail		*ailp = efip->efi_item.li_ailp;

	if (atomic_dec_and_test(&efip->efi_refcount)) {
		spin_lock(&ailp->xa_lock);
		/*
		 * 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_trans_ail_remove(&efip->efi_item, SHUTDOWN_LOG_IO_ERROR);
		xfs_efi_item_free(efip);
	}
}
+2 −9
Original line number Diff line number Diff line
@@ -703,17 +703,10 @@ xfs_iflush_abort(
	xfs_inode_log_item_t	*iip = ip->i_itemp;

	if (iip) {
		struct xfs_ail	*ailp = iip->ili_item.li_ailp;
		if (iip->ili_item.li_flags & XFS_LI_IN_AIL) {
			spin_lock(&ailp->xa_lock);
			if (iip->ili_item.li_flags & XFS_LI_IN_AIL) {
				/* xfs_trans_ail_delete() drops the AIL lock. */
				xfs_trans_ail_delete(ailp, &iip->ili_item,
						stale ?
						     SHUTDOWN_LOG_IO_ERROR :
			xfs_trans_ail_remove(&iip->ili_item,
					     stale ? SHUTDOWN_LOG_IO_ERROR :
						     SHUTDOWN_CORRUPT_INCORE);
			} else
				spin_unlock(&ailp->xa_lock);
		}
		iip->ili_logged = 0;
		/*
+15 −0
Original line number Diff line number Diff line
@@ -119,6 +119,21 @@ xfs_trans_ail_delete(
	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_all(struct xfs_ail *);
void			xfs_ail_push_all_sync(struct xfs_ail *);