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

Commit 87b8a7fb authored by Dave Chinner's avatar Dave Chinner Committed by Greg Kroah-Hartman
Browse files

xfs: factor common AIL item deletion code



commit 4165994ac9672d91134675caa6de3645a9ace6c8 upstream.

Factor the common AIL deletion code that does all the wakeups into a
helper so we only have one copy of this somewhat tricky code to
interface with all the wakeups necessary when the LSN of the log
tail changes.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarAllison Collins <allison.henderson@oracle.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Acked-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarChandan Babu R <chandan.babu@oracle.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 4202b103
Loading
Loading
Loading
Loading
+1 −11
Original line number Diff line number Diff line
@@ -744,17 +744,7 @@ xfs_iflush_done(
				xfs_clear_li_failed(blip);
			}
		}

		if (mlip_changed) {
			if (!XFS_FORCED_SHUTDOWN(ailp->ail_mount))
				xlog_assign_tail_lsn_locked(ailp->ail_mount);
			if (list_empty(&ailp->ail_head))
				wake_up_all(&ailp->ail_empty);
		}
		spin_unlock(&ailp->ail_lock);

		if (mlip_changed)
			xfs_log_space_wake(ailp->ail_mount);
		xfs_ail_update_finish(ailp, mlip_changed);
	}

	/*
+26 −22
Original line number Diff line number Diff line
@@ -680,6 +680,27 @@ xfs_ail_push_all_sync(
	finish_wait(&ailp->ail_empty, &wait);
}

void
xfs_ail_update_finish(
	struct xfs_ail		*ailp,
	bool			do_tail_update) __releases(ailp->ail_lock)
{
	struct xfs_mount	*mp = ailp->ail_mount;

	if (!do_tail_update) {
		spin_unlock(&ailp->ail_lock);
		return;
	}

	if (!XFS_FORCED_SHUTDOWN(mp))
		xlog_assign_tail_lsn_locked(mp);

	if (list_empty(&ailp->ail_head))
		wake_up_all(&ailp->ail_empty);
	spin_unlock(&ailp->ail_lock);
	xfs_log_space_wake(mp);
}

/*
 * xfs_trans_ail_update - bulk AIL insertion operation.
 *
@@ -739,15 +760,7 @@ xfs_trans_ail_update_bulk(
	if (!list_empty(&tmp))
		xfs_ail_splice(ailp, cur, &tmp, lsn);

	if (mlip_changed) {
		if (!XFS_FORCED_SHUTDOWN(ailp->ail_mount))
			xlog_assign_tail_lsn_locked(ailp->ail_mount);
		spin_unlock(&ailp->ail_lock);

		xfs_log_space_wake(ailp->ail_mount);
	} else {
		spin_unlock(&ailp->ail_lock);
	}
	xfs_ail_update_finish(ailp, mlip_changed);
}

bool
@@ -791,10 +804,10 @@ void
xfs_trans_ail_delete(
	struct xfs_ail		*ailp,
	struct xfs_log_item	*lip,
	int			shutdown_type) __releases(ailp->ail_lock)
	int			shutdown_type)
{
	struct xfs_mount	*mp = ailp->ail_mount;
	bool			mlip_changed;
	bool			need_update;

	if (!test_bit(XFS_LI_IN_AIL, &lip->li_flags)) {
		spin_unlock(&ailp->ail_lock);
@@ -807,17 +820,8 @@ xfs_trans_ail_delete(
		return;
	}

	mlip_changed = xfs_ail_delete_one(ailp, lip);
	if (mlip_changed) {
		if (!XFS_FORCED_SHUTDOWN(mp))
			xlog_assign_tail_lsn_locked(mp);
		if (list_empty(&ailp->ail_head))
			wake_up_all(&ailp->ail_empty);
	}

	spin_unlock(&ailp->ail_lock);
	if (mlip_changed)
		xfs_log_space_wake(ailp->ail_mount);
	need_update = xfs_ail_delete_one(ailp, lip);
	xfs_ail_update_finish(ailp, need_update);
}

int
+3 −1
Original line number Diff line number Diff line
@@ -92,8 +92,10 @@ xfs_trans_ail_update(
}

bool xfs_ail_delete_one(struct xfs_ail *ailp, struct xfs_log_item *lip);
void xfs_ail_update_finish(struct xfs_ail *ailp, bool do_tail_update)
			__releases(ailp->ail_lock);
void xfs_trans_ail_delete(struct xfs_ail *ailp, struct xfs_log_item *lip,
		int shutdown_type) __releases(ailp->ail_lock);
		int shutdown_type);

static inline void
xfs_trans_ail_remove(