Skip to content

Commit

Permalink
xfs: pass transaction to dfops reset/move helpers
Browse files Browse the repository at this point in the history
All callers pass ->t_dfops of the associated transactions. Refactor
the helpers to receive the transactions and facilitate further
cleanups between xfs_defer_ops and xfs_trans.

Signed-off-by: Brian Foster <[email protected]>
Reviewed-by: Darrick J. Wong <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Signed-off-by: Darrick J. Wong <[email protected]>
  • Loading branch information
Brian Foster authored and djwong committed Aug 3, 2018
1 parent 7279aa1 commit ce356d6
Show file tree
Hide file tree
Showing 6 changed files with 19 additions and 14 deletions.
15 changes: 10 additions & 5 deletions fs/xfs/libxfs/xfs_defer.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,9 +324,12 @@ xfs_defer_bjoin(
*/
static void
xfs_defer_reset(
struct xfs_defer_ops *dop)
struct xfs_trans *tp)
{
struct xfs_defer_ops *dop = tp->t_dfops;

ASSERT(!xfs_defer_has_unfinished_work(dop));

dop->dop_low = false;
memset(dop->dop_inodes, 0, sizeof(dop->dop_inodes));
memset(dop->dop_bufs, 0, sizeof(dop->dop_bufs));
Expand Down Expand Up @@ -457,7 +460,7 @@ xfs_defer_finish(
if (error)
return error;
}
xfs_defer_reset((*tp)->t_dfops);
xfs_defer_reset(*tp);
return 0;
}

Expand Down Expand Up @@ -575,9 +578,11 @@ xfs_defer_init(
*/
void
xfs_defer_move(
struct xfs_defer_ops *dst,
struct xfs_defer_ops *src)
struct xfs_trans *dtp,
struct xfs_trans *stp)
{
struct xfs_defer_ops *dst = dtp->t_dfops;
struct xfs_defer_ops *src = stp->t_dfops;
ASSERT(dst != src);

list_splice_init(&src->dop_intake, &dst->dop_intake);
Expand All @@ -587,5 +592,5 @@ xfs_defer_move(
memcpy(dst->dop_bufs, src->dop_bufs, sizeof(dst->dop_bufs));
dst->dop_low = src->dop_low;

xfs_defer_reset(src);
xfs_defer_reset(stp);
}
2 changes: 1 addition & 1 deletion fs/xfs/libxfs/xfs_defer.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ void xfs_defer_init(struct xfs_trans *tp, struct xfs_defer_ops *dop);
bool xfs_defer_has_unfinished_work(struct xfs_defer_ops *dop);
int xfs_defer_ijoin(struct xfs_defer_ops *dop, struct xfs_inode *ip);
int xfs_defer_bjoin(struct xfs_defer_ops *dop, struct xfs_buf *bp);
void xfs_defer_move(struct xfs_defer_ops *dst, struct xfs_defer_ops *src);
void xfs_defer_move(struct xfs_trans *dtp, struct xfs_trans *stp);

/* Description of a deferred type. */
struct xfs_defer_op_type {
Expand Down
6 changes: 3 additions & 3 deletions fs/xfs/xfs_bmap_item.c
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ xfs_bui_recover(
* finishes them on completion. Transfer current dfops state to this
* transaction and transfer the result back before we return.
*/
xfs_defer_move(tp->t_dfops, parent_tp->t_dfops);
xfs_defer_move(tp, parent_tp);
budp = xfs_trans_get_bud(tp, buip);

/* Grab the inode. */
Expand Down Expand Up @@ -494,15 +494,15 @@ xfs_bui_recover(
}

set_bit(XFS_BUI_RECOVERED, &buip->bui_flags);
xfs_defer_move(parent_tp->t_dfops, tp->t_dfops);
xfs_defer_move(parent_tp, tp);
error = xfs_trans_commit(tp);
xfs_iunlock(ip, XFS_ILOCK_EXCL);
xfs_irele(ip);

return error;

err_inode:
xfs_defer_move(parent_tp->t_dfops, tp->t_dfops);
xfs_defer_move(parent_tp, tp);
xfs_trans_cancel(tp);
if (ip) {
xfs_iunlock(ip, XFS_ILOCK_EXCL);
Expand Down
2 changes: 1 addition & 1 deletion fs/xfs/xfs_log_recover.c
Original file line number Diff line number Diff line change
Expand Up @@ -4853,7 +4853,7 @@ xlog_finish_defer_ops(
if (error)
return error;
/* transfer all collected dfops to this transaction */
xfs_defer_move(tp->t_dfops, parent_tp->t_dfops);
xfs_defer_move(tp, parent_tp);

return xfs_trans_commit(tp);
}
Expand Down
6 changes: 3 additions & 3 deletions fs/xfs/xfs_refcount_item.c
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ xfs_cui_recover(
* finishes them on completion. Transfer current dfops state to this
* transaction and transfer the result back before we return.
*/
xfs_defer_move(tp->t_dfops, parent_tp->t_dfops);
xfs_defer_move(tp, parent_tp);
cudp = xfs_trans_get_cud(tp, cuip);

for (i = 0; i < cuip->cui_format.cui_nextents; i++) {
Expand Down Expand Up @@ -522,13 +522,13 @@ xfs_cui_recover(

xfs_refcount_finish_one_cleanup(tp, rcur, error);
set_bit(XFS_CUI_RECOVERED, &cuip->cui_flags);
xfs_defer_move(parent_tp->t_dfops, tp->t_dfops);
xfs_defer_move(parent_tp, tp);
error = xfs_trans_commit(tp);
return error;

abort_error:
xfs_refcount_finish_one_cleanup(tp, rcur, error);
xfs_defer_move(parent_tp->t_dfops, tp->t_dfops);
xfs_defer_move(parent_tp, tp);
xfs_trans_cancel(tp);
return error;
}
2 changes: 1 addition & 1 deletion fs/xfs/xfs_trans.c
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ xfs_trans_dup(
if (tp->t_dfops != &tp->t_dfops_internal)
ntp->t_dfops = tp->t_dfops;
else
xfs_defer_move(ntp->t_dfops, tp->t_dfops);
xfs_defer_move(ntp, tp);

xfs_trans_dup_dqinfo(tp, ntp);

Expand Down

0 comments on commit ce356d6

Please sign in to comment.