Commit 8b41e3f9 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong
Browse files

xfs: split xlog_ticket_done



Remove xlog_ticket_done and just call the renamed low-level helpers for
ungranting or regranting log space directly.  To make that a little
the reference put on the ticket and all tracing is moved into the actual
helpers.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.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>
parent 70e42f2d
Loading
Loading
Loading
Loading
+27 −57
Original line number Diff line number Diff line
@@ -66,14 +66,6 @@ xlog_grant_push_ail(
	struct xlog		*log,
	int			need_bytes);
STATIC void
xlog_regrant_reserve_log_space(
	struct xlog		*log,
	struct xlog_ticket	*ticket);
STATIC void
xlog_ungrant_log_space(
	struct xlog		*log,
	struct xlog_ticket	*ticket);
STATIC void
xlog_sync(
	struct xlog		*log,
	struct xlog_in_core	*iclog);
@@ -502,27 +494,6 @@ xlog_write_done(
	return xlog_commit_record(log, ticket, iclog, lsn);
}

/*
 * Release or regrant the ticket reservation now the transaction is done with
 * it depending on caller context. Rolling transactions need the ticket
 * regranted, otherwise we release it completely.
 */
void
xlog_ticket_done(
	struct xlog		*log,
	struct xlog_ticket	*ticket,
	bool			regrant)
{
	if (!regrant || XLOG_FORCED_SHUTDOWN(log)) {
		trace_xfs_log_done_nonperm(log, ticket);
		xlog_ungrant_log_space(log, ticket);
	} else {
		trace_xfs_log_done_perm(log, ticket);
		xlog_regrant_reserve_log_space(log, ticket);
	}
	xfs_log_ticket_put(ticket);
}

static bool
__xlog_state_release_iclog(
	struct xlog		*log,
@@ -921,8 +892,7 @@ out_err:

	if (tic) {
		trace_xfs_log_umount_write(log, tic);
		xlog_ungrant_log_space(log, tic);
		xfs_log_ticket_put(tic);
		xfs_log_ticket_ungrant(log, tic);
	}
}

@@ -2992,19 +2962,18 @@ restart:
	return 0;
}	/* xlog_state_get_iclog_space */

/* The first cnt-1 times through here we don't need to
 * move the grant write head because the permanent
 * reservation has reserved cnt times the unit amount.
 * Release part of current permanent unit reservation and
 * reset current reservation to be one units worth.  Also
 * move grant reservation head forward.
/*
 * The first cnt-1 times through here we don't need to move the grant write head
 * because the permanent reservation has reserved cnt times the unit amount.
 * Release part of current permanent unit reservation and reset current
 * reservation to be one units worth.  Also move grant reservation head forward.
 */
STATIC void
xlog_regrant_reserve_log_space(
void
xfs_log_ticket_regrant(
	struct xlog		*log,
	struct xlog_ticket	*ticket)
{
	trace_xfs_log_regrant_reserve_enter(log, ticket);
	trace_xfs_log_ticket_regrant(log, ticket);

	if (ticket->t_cnt > 0)
		ticket->t_cnt--;
@@ -3016,21 +2985,20 @@ xlog_regrant_reserve_log_space(
	ticket->t_curr_res = ticket->t_unit_res;
	xlog_tic_reset_res(ticket);

	trace_xfs_log_regrant_reserve_sub(log, ticket);
	trace_xfs_log_ticket_regrant_sub(log, ticket);

	/* just return if we still have some of the pre-reserved space */
	if (ticket->t_cnt > 0)
		return;

	if (!ticket->t_cnt) {
		xlog_grant_add_space(log, &log->l_reserve_head.grant,
				     ticket->t_unit_res);

	trace_xfs_log_regrant_reserve_exit(log, ticket);
		trace_xfs_log_ticket_regrant_exit(log, ticket);

		ticket->t_curr_res = ticket->t_unit_res;
		xlog_tic_reset_res(ticket);
}	/* xlog_regrant_reserve_log_space */
	}

	xfs_log_ticket_put(ticket);
}

/*
 * Give back the space left from a reservation.
@@ -3046,18 +3014,19 @@ xlog_regrant_reserve_log_space(
 * space, the count will stay at zero and the only space remaining will be
 * in the current reservation field.
 */
STATIC void
xlog_ungrant_log_space(
void
xfs_log_ticket_ungrant(
	struct xlog		*log,
	struct xlog_ticket	*ticket)
{
	int			bytes;

	trace_xfs_log_ticket_ungrant(log, ticket);

	if (ticket->t_cnt > 0)
		ticket->t_cnt--;

	trace_xfs_log_ungrant_enter(log, ticket);
	trace_xfs_log_ungrant_sub(log, ticket);
	trace_xfs_log_ticket_ungrant_sub(log, ticket);

	/*
	 * If this is a permanent reservation ticket, we may be able to free
@@ -3072,9 +3041,10 @@ xlog_ungrant_log_space(
	xlog_grant_sub_space(log, &log->l_reserve_head.grant, bytes);
	xlog_grant_sub_space(log, &log->l_write_head.grant, bytes);

	trace_xfs_log_ungrant_exit(log, ticket);
	trace_xfs_log_ticket_ungrant_exit(log, ticket);

	xfs_log_space_wake(log->l_mp);
	xfs_log_ticket_put(ticket);
}

/*
+6 −3
Original line number Diff line number Diff line
@@ -843,7 +843,7 @@ restart:
	if (error)
		goto out_abort_free_ticket;

	xlog_ticket_done(log, tic, false);
	xfs_log_ticket_ungrant(log, tic);

	spin_lock(&commit_iclog->ic_callback_lock);
	if (commit_iclog->ic_state == XLOG_STATE_IOERROR) {
@@ -876,7 +876,7 @@ out_skip:
	return;

out_abort_free_ticket:
	xlog_ticket_done(log, tic, false);
	xfs_log_ticket_ungrant(log, tic);
out_abort:
	ASSERT(XLOG_FORCED_SHUTDOWN(log));
	xlog_cil_committed(ctx);
@@ -1008,7 +1008,10 @@ xfs_log_commit_cil(
	if (commit_lsn)
		*commit_lsn = xc_commit_lsn;

	xlog_ticket_done(log, tp->t_ticket, regrant);
	if (regrant && !XLOG_FORCED_SHUTDOWN(log))
		xfs_log_ticket_regrant(log, tp->t_ticket);
	else
		xfs_log_ticket_ungrant(log, tp->t_ticket);
	tp->t_ticket = NULL;
	xfs_trans_unreserve_and_mod_sb(tp);

+2 −2
Original line number Diff line number Diff line
@@ -443,8 +443,8 @@ int xlog_write(struct xlog *log, struct xfs_log_vec *log_vector,
		bool need_start_rec);
int	xlog_write_done(struct xlog *log, struct xlog_ticket *ticket,
		struct xlog_in_core **iclog, xfs_lsn_t *lsn);
void	xlog_ticket_done(struct xlog *log, struct xlog_ticket *ticket,
		bool regrant);
void	xfs_log_ticket_ungrant(struct xlog *log, struct xlog_ticket *ticket);
void	xfs_log_ticket_regrant(struct xlog *log, struct xlog_ticket *ticket);

/*
 * When we crack an atomic LSN, we sample it first so that the value will not
+6 −8
Original line number Diff line number Diff line
@@ -1001,8 +1001,6 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class,
DEFINE_EVENT(xfs_loggrant_class, name, \
	TP_PROTO(struct xlog *log, struct xlog_ticket *tic), \
	TP_ARGS(log, tic))
DEFINE_LOGGRANT_EVENT(xfs_log_done_nonperm);
DEFINE_LOGGRANT_EVENT(xfs_log_done_perm);
DEFINE_LOGGRANT_EVENT(xfs_log_umount_write);
DEFINE_LOGGRANT_EVENT(xfs_log_grant_sleep);
DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake);
@@ -1011,12 +1009,12 @@ DEFINE_LOGGRANT_EVENT(xfs_log_reserve);
DEFINE_LOGGRANT_EVENT(xfs_log_reserve_exit);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant_exit);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_enter);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_exit);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_sub);
DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_enter);
DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_exit);
DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_sub);
DEFINE_LOGGRANT_EVENT(xfs_log_ticket_regrant);
DEFINE_LOGGRANT_EVENT(xfs_log_ticket_regrant_exit);
DEFINE_LOGGRANT_EVENT(xfs_log_ticket_regrant_sub);
DEFINE_LOGGRANT_EVENT(xfs_log_ticket_ungrant);
DEFINE_LOGGRANT_EVENT(xfs_log_ticket_ungrant_sub);
DEFINE_LOGGRANT_EVENT(xfs_log_ticket_ungrant_exit);

DECLARE_EVENT_CLASS(xfs_log_item_class,
	TP_PROTO(struct xfs_log_item *lip),
+6 −3
Original line number Diff line number Diff line
@@ -231,7 +231,7 @@ xfs_trans_reserve(
	 */
undo_log:
	if (resp->tr_logres > 0) {
		xlog_ticket_done(mp->m_log, tp->t_ticket, false);
		xfs_log_ticket_ungrant(mp->m_log, tp->t_ticket);
		tp->t_ticket = NULL;
		tp->t_log_res = 0;
		tp->t_flags &= ~XFS_TRANS_PERM_LOG_RES;
@@ -1006,7 +1006,10 @@ out_unreserve:
	 */
	xfs_trans_unreserve_and_mod_dquots(tp);
	if (tp->t_ticket) {
		xlog_ticket_done(mp->m_log, tp->t_ticket, regrant);
		if (regrant && !XLOG_FORCED_SHUTDOWN(mp->m_log))
			xfs_log_ticket_regrant(mp->m_log, tp->t_ticket);
		else
			xfs_log_ticket_ungrant(mp->m_log, tp->t_ticket);
		tp->t_ticket = NULL;
	}
	current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
@@ -1065,7 +1068,7 @@ xfs_trans_cancel(
	xfs_trans_unreserve_and_mod_dquots(tp);

	if (tp->t_ticket) {
		xlog_ticket_done(mp->m_log, tp->t_ticket, false);
		xfs_log_ticket_ungrant(mp->m_log, tp->t_ticket);
		tp->t_ticket = NULL;
	}