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

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
...@@ -66,14 +66,6 @@ xlog_grant_push_ail( ...@@ -66,14 +66,6 @@ xlog_grant_push_ail(
struct xlog *log, struct xlog *log,
int need_bytes); int need_bytes);
STATIC void 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( xlog_sync(
struct xlog *log, struct xlog *log,
struct xlog_in_core *iclog); struct xlog_in_core *iclog);
...@@ -502,27 +494,6 @@ xlog_write_done( ...@@ -502,27 +494,6 @@ xlog_write_done(
return xlog_commit_record(log, ticket, iclog, lsn); 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 static bool
__xlog_state_release_iclog( __xlog_state_release_iclog(
struct xlog *log, struct xlog *log,
...@@ -921,8 +892,7 @@ xfs_log_write_unmount_record( ...@@ -921,8 +892,7 @@ xfs_log_write_unmount_record(
if (tic) { if (tic) {
trace_xfs_log_umount_write(log, tic); trace_xfs_log_umount_write(log, tic);
xlog_ungrant_log_space(log, tic); xfs_log_ticket_ungrant(log, tic);
xfs_log_ticket_put(tic);
} }
} }
...@@ -2992,19 +2962,18 @@ xlog_state_get_iclog_space( ...@@ -2992,19 +2962,18 @@ xlog_state_get_iclog_space(
return 0; return 0;
} /* xlog_state_get_iclog_space */ } /* 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 * The first cnt-1 times through here we don't need to move the grant write head
* reservation has reserved cnt times the unit amount. * because the permanent reservation has reserved cnt times the unit amount.
* Release part of current permanent unit reservation and * Release part of current permanent unit reservation and reset current
* reset current reservation to be one units worth. Also * reservation to be one units worth. Also move grant reservation head forward.
* move grant reservation head forward.
*/ */
STATIC void void
xlog_regrant_reserve_log_space( xfs_log_ticket_regrant(
struct xlog *log, struct xlog *log,
struct xlog_ticket *ticket) struct xlog_ticket *ticket)
{ {
trace_xfs_log_regrant_reserve_enter(log, ticket); trace_xfs_log_ticket_regrant(log, ticket);
if (ticket->t_cnt > 0) if (ticket->t_cnt > 0)
ticket->t_cnt--; ticket->t_cnt--;
...@@ -3016,21 +2985,20 @@ xlog_regrant_reserve_log_space( ...@@ -3016,21 +2985,20 @@ xlog_regrant_reserve_log_space(
ticket->t_curr_res = ticket->t_unit_res; ticket->t_curr_res = ticket->t_unit_res;
xlog_tic_reset_res(ticket); 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 */ /* just return if we still have some of the pre-reserved space */
if (ticket->t_cnt > 0) if (!ticket->t_cnt) {
return; xlog_grant_add_space(log, &log->l_reserve_head.grant,
ticket->t_unit_res);
trace_xfs_log_ticket_regrant_exit(log, ticket);
xlog_grant_add_space(log, &log->l_reserve_head.grant, ticket->t_curr_res = ticket->t_unit_res;
ticket->t_unit_res); xlog_tic_reset_res(ticket);
}
trace_xfs_log_regrant_reserve_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. * Give back the space left from a reservation.
...@@ -3046,18 +3014,19 @@ xlog_regrant_reserve_log_space( ...@@ -3046,18 +3014,19 @@ xlog_regrant_reserve_log_space(
* space, the count will stay at zero and the only space remaining will be * space, the count will stay at zero and the only space remaining will be
* in the current reservation field. * in the current reservation field.
*/ */
STATIC void void
xlog_ungrant_log_space( xfs_log_ticket_ungrant(
struct xlog *log, struct xlog *log,
struct xlog_ticket *ticket) struct xlog_ticket *ticket)
{ {
int bytes; int bytes;
trace_xfs_log_ticket_ungrant(log, ticket);
if (ticket->t_cnt > 0) if (ticket->t_cnt > 0)
ticket->t_cnt--; ticket->t_cnt--;
trace_xfs_log_ungrant_enter(log, ticket); trace_xfs_log_ticket_ungrant_sub(log, ticket);
trace_xfs_log_ungrant_sub(log, ticket);
/* /*
* If this is a permanent reservation ticket, we may be able to free * If this is a permanent reservation ticket, we may be able to free
...@@ -3072,9 +3041,10 @@ xlog_ungrant_log_space( ...@@ -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_reserve_head.grant, bytes);
xlog_grant_sub_space(log, &log->l_write_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_space_wake(log->l_mp);
xfs_log_ticket_put(ticket);
} }
/* /*
......
...@@ -843,7 +843,7 @@ xlog_cil_push_work( ...@@ -843,7 +843,7 @@ xlog_cil_push_work(
if (error) if (error)
goto out_abort_free_ticket; goto out_abort_free_ticket;
xlog_ticket_done(log, tic, false); xfs_log_ticket_ungrant(log, tic);
spin_lock(&commit_iclog->ic_callback_lock); spin_lock(&commit_iclog->ic_callback_lock);
if (commit_iclog->ic_state == XLOG_STATE_IOERROR) { if (commit_iclog->ic_state == XLOG_STATE_IOERROR) {
...@@ -876,7 +876,7 @@ xlog_cil_push_work( ...@@ -876,7 +876,7 @@ xlog_cil_push_work(
return; return;
out_abort_free_ticket: out_abort_free_ticket:
xlog_ticket_done(log, tic, false); xfs_log_ticket_ungrant(log, tic);
out_abort: out_abort:
ASSERT(XLOG_FORCED_SHUTDOWN(log)); ASSERT(XLOG_FORCED_SHUTDOWN(log));
xlog_cil_committed(ctx); xlog_cil_committed(ctx);
...@@ -1008,7 +1008,10 @@ xfs_log_commit_cil( ...@@ -1008,7 +1008,10 @@ xfs_log_commit_cil(
if (commit_lsn) if (commit_lsn)
*commit_lsn = xc_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; tp->t_ticket = NULL;
xfs_trans_unreserve_and_mod_sb(tp); xfs_trans_unreserve_and_mod_sb(tp);
......
...@@ -443,8 +443,8 @@ int xlog_write(struct xlog *log, struct xfs_log_vec *log_vector, ...@@ -443,8 +443,8 @@ int xlog_write(struct xlog *log, struct xfs_log_vec *log_vector,
bool need_start_rec); bool need_start_rec);
int xlog_write_done(struct xlog *log, struct xlog_ticket *ticket, int xlog_write_done(struct xlog *log, struct xlog_ticket *ticket,
struct xlog_in_core **iclog, xfs_lsn_t *lsn); struct xlog_in_core **iclog, xfs_lsn_t *lsn);
void xlog_ticket_done(struct xlog *log, struct xlog_ticket *ticket, void xfs_log_ticket_ungrant(struct xlog *log, struct xlog_ticket *ticket);
bool regrant); 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 * When we crack an atomic LSN, we sample it first so that the value will not
......
...@@ -1001,8 +1001,6 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class, ...@@ -1001,8 +1001,6 @@ DECLARE_EVENT_CLASS(xfs_loggrant_class,
DEFINE_EVENT(xfs_loggrant_class, name, \ DEFINE_EVENT(xfs_loggrant_class, name, \
TP_PROTO(struct xlog *log, struct xlog_ticket *tic), \ TP_PROTO(struct xlog *log, struct xlog_ticket *tic), \
TP_ARGS(log, 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_umount_write);
DEFINE_LOGGRANT_EVENT(xfs_log_grant_sleep); DEFINE_LOGGRANT_EVENT(xfs_log_grant_sleep);
DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake); DEFINE_LOGGRANT_EVENT(xfs_log_grant_wake);
...@@ -1011,12 +1009,12 @@ DEFINE_LOGGRANT_EVENT(xfs_log_reserve); ...@@ -1011,12 +1009,12 @@ DEFINE_LOGGRANT_EVENT(xfs_log_reserve);
DEFINE_LOGGRANT_EVENT(xfs_log_reserve_exit); DEFINE_LOGGRANT_EVENT(xfs_log_reserve_exit);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant); DEFINE_LOGGRANT_EVENT(xfs_log_regrant);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant_exit); DEFINE_LOGGRANT_EVENT(xfs_log_regrant_exit);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_enter); DEFINE_LOGGRANT_EVENT(xfs_log_ticket_regrant);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_exit); DEFINE_LOGGRANT_EVENT(xfs_log_ticket_regrant_exit);
DEFINE_LOGGRANT_EVENT(xfs_log_regrant_reserve_sub); DEFINE_LOGGRANT_EVENT(xfs_log_ticket_regrant_sub);
DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_enter); DEFINE_LOGGRANT_EVENT(xfs_log_ticket_ungrant);
DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_exit); DEFINE_LOGGRANT_EVENT(xfs_log_ticket_ungrant_sub);
DEFINE_LOGGRANT_EVENT(xfs_log_ungrant_sub); DEFINE_LOGGRANT_EVENT(xfs_log_ticket_ungrant_exit);
DECLARE_EVENT_CLASS(xfs_log_item_class, DECLARE_EVENT_CLASS(xfs_log_item_class,
TP_PROTO(struct xfs_log_item *lip), TP_PROTO(struct xfs_log_item *lip),
......
...@@ -231,7 +231,7 @@ xfs_trans_reserve( ...@@ -231,7 +231,7 @@ xfs_trans_reserve(
*/ */
undo_log: undo_log:
if (resp->tr_logres > 0) { 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_ticket = NULL;
tp->t_log_res = 0; tp->t_log_res = 0;
tp->t_flags &= ~XFS_TRANS_PERM_LOG_RES; tp->t_flags &= ~XFS_TRANS_PERM_LOG_RES;
...@@ -1006,7 +1006,10 @@ __xfs_trans_commit( ...@@ -1006,7 +1006,10 @@ __xfs_trans_commit(
*/ */
xfs_trans_unreserve_and_mod_dquots(tp); xfs_trans_unreserve_and_mod_dquots(tp);
if (tp->t_ticket) { 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; tp->t_ticket = NULL;
} }
current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS); current_restore_flags_nested(&tp->t_pflags, PF_MEMALLOC_NOFS);
...@@ -1065,7 +1068,7 @@ xfs_trans_cancel( ...@@ -1065,7 +1068,7 @@ xfs_trans_cancel(
xfs_trans_unreserve_and_mod_dquots(tp); xfs_trans_unreserve_and_mod_dquots(tp);
if (tp->t_ticket) { 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; tp->t_ticket = NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment