forked from Minki/linux
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: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
70e42f2d47
commit
8b41e3f98e
@ -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_ticket_regrant_exit(log, ticket);
|
||||
|
||||
xlog_grant_add_space(log, &log->l_reserve_head.grant,
|
||||
ticket->t_unit_res);
|
||||
|
||||
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 */
|
||||
ticket->t_curr_res = ticket->t_unit_res;
|
||||
xlog_tic_reset_res(ticket);
|
||||
}
|
||||
|
||||
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;
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user