xfs: saner xfs_trans_commit interface
The flags argument to xfs_trans_commit is not useful for most callers, as a commit of a transaction without a permanent log reservation must pass 0 here, and all callers for a transaction with a permanent log reservation except for xfs_trans_roll must pass XFS_TRANS_RELEASE_LOG_RES. So remove the flags argument from the public xfs_trans_commit interfaces, and introduce low-level __xfs_trans_commit variant just for xfs_trans_roll that regrants a log reservation instead of releasing it. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:

committed by
Dave Chinner

parent
4906e21545
commit
70393313dd
@@ -892,26 +892,16 @@ xfs_trans_committed_bulk(
|
||||
* have already been unlocked as if the commit had succeeded.
|
||||
* Do not reference the transaction structure after this call.
|
||||
*/
|
||||
int
|
||||
xfs_trans_commit(
|
||||
static int
|
||||
__xfs_trans_commit(
|
||||
struct xfs_trans *tp,
|
||||
uint flags)
|
||||
bool regrant)
|
||||
{
|
||||
struct xfs_mount *mp = tp->t_mountp;
|
||||
xfs_lsn_t commit_lsn = -1;
|
||||
int error = 0;
|
||||
int log_flags = 0;
|
||||
int sync = tp->t_flags & XFS_TRANS_SYNC;
|
||||
|
||||
/*
|
||||
* Determine whether this commit is releasing a permanent
|
||||
* log reservation or not.
|
||||
*/
|
||||
if (flags & XFS_TRANS_RELEASE_LOG_RES) {
|
||||
ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
|
||||
log_flags = XFS_LOG_REL_PERM_RESERV;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is nothing to be logged by the transaction,
|
||||
* then unlock all of the items associated with the
|
||||
@@ -936,7 +926,7 @@ xfs_trans_commit(
|
||||
xfs_trans_apply_sb_deltas(tp);
|
||||
xfs_trans_apply_dquot_deltas(tp);
|
||||
|
||||
xfs_log_commit_cil(mp, tp, &commit_lsn, flags);
|
||||
xfs_log_commit_cil(mp, tp, &commit_lsn, regrant);
|
||||
|
||||
current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS);
|
||||
xfs_trans_free(tp);
|
||||
@@ -964,6 +954,12 @@ out_unreserve:
|
||||
*/
|
||||
xfs_trans_unreserve_and_mod_dquots(tp);
|
||||
if (tp->t_ticket) {
|
||||
int log_flags = 0;
|
||||
|
||||
if (regrant)
|
||||
ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
|
||||
else
|
||||
log_flags = XFS_LOG_REL_PERM_RESERV;
|
||||
commit_lsn = xfs_log_done(mp, tp->t_ticket, NULL, log_flags);
|
||||
if (commit_lsn == -1 && !error)
|
||||
error = -EIO;
|
||||
@@ -976,6 +972,13 @@ out_unreserve:
|
||||
return error;
|
||||
}
|
||||
|
||||
int
|
||||
xfs_trans_commit(
|
||||
struct xfs_trans *tp)
|
||||
{
|
||||
return __xfs_trans_commit(tp, false);
|
||||
}
|
||||
|
||||
/*
|
||||
* Unlock all of the transaction's items and free the transaction.
|
||||
* The transaction must not have modified any of its items, because
|
||||
@@ -1029,7 +1032,7 @@ xfs_trans_cancel(
|
||||
/*
|
||||
* Roll from one trans in the sequence of PERMANENT transactions to
|
||||
* the next: permanent transactions are only flushed out when
|
||||
* committed with XFS_TRANS_RELEASE_LOG_RES, but we still want as soon
|
||||
* committed with xfs_trans_commit(), but we still want as soon
|
||||
* as possible to let chunks of it go to the log. So we commit the
|
||||
* chunk we've been working on and get a new transaction to continue.
|
||||
*/
|
||||
@@ -1063,7 +1066,7 @@ xfs_trans_roll(
|
||||
* is in progress. The caller takes the responsibility to cancel
|
||||
* the duplicate transaction that gets returned.
|
||||
*/
|
||||
error = xfs_trans_commit(trans, 0);
|
||||
error = __xfs_trans_commit(trans, true);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
Reference in New Issue
Block a user