*/
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));
if (error)
return error;
}
- xfs_defer_reset((*tp)->t_dfops);
+ xfs_defer_reset(*tp);
return 0;
}
*/
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);
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);
}
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 {
* 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. */
}
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);
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);
}
* 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++) {
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;
}
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);