struct xfs_inode                *ip,
        struct xfs_inode                *tip)
 {
+       struct xfs_trans                *tp = *tpp;
+       struct xfs_mount                *mp = tp->t_mountp;
        struct xfs_bmbt_irec            irec;
        struct xfs_bmbt_irec            uirec;
        struct xfs_bmbt_irec            tirec;
        xfs_fileoff_t                   end_fsb;
        xfs_filblks_t                   count_fsb;
        xfs_fsblock_t                   firstfsb;
-       struct xfs_defer_ops            dfops;
        int                             error;
        xfs_filblks_t                   ilen;
        xfs_filblks_t                   rlen;
 
                /* Unmap the old blocks in the source file. */
                while (tirec.br_blockcount) {
-                       xfs_defer_init(&dfops, &firstfsb);
+                       xfs_defer_init(tp->t_dfops, &firstfsb);
                        trace_xfs_swap_extent_rmap_remap_piece(tip, &tirec);
 
                        /* Read extent from the source file */
                        trace_xfs_swap_extent_rmap_remap_piece(tip, &uirec);
 
                        /* Remove the mapping from the donor file. */
-                       error = xfs_bmap_unmap_extent((*tpp)->t_mountp, &dfops,
-                                       tip, &uirec);
+                       error = xfs_bmap_unmap_extent(mp, tp->t_dfops, tip,
+                                       &uirec);
                        if (error)
                                goto out_defer;
 
                        /* Remove the mapping from the source file. */
-                       error = xfs_bmap_unmap_extent((*tpp)->t_mountp, &dfops,
-                                       ip, &irec);
+                       error = xfs_bmap_unmap_extent(mp, tp->t_dfops, ip,
+                                       &irec);
                        if (error)
                                goto out_defer;
 
                        /* Map the donor file's blocks into the source file. */
-                       error = xfs_bmap_map_extent((*tpp)->t_mountp, &dfops,
-                                       ip, &uirec);
+                       error = xfs_bmap_map_extent(mp, tp->t_dfops, ip,
+                                       &uirec);
                        if (error)
                                goto out_defer;
 
                        /* Map the source file's blocks into the donor file. */
-                       error = xfs_bmap_map_extent((*tpp)->t_mountp, &dfops,
-                                       tip, &irec);
+                       error = xfs_bmap_map_extent(mp, tp->t_dfops, tip,
+                                       &irec);
                        if (error)
                                goto out_defer;
 
-                       xfs_defer_ijoin(&dfops, ip);
-                       error = xfs_defer_finish(tpp, &dfops);
+                       xfs_defer_ijoin(tp->t_dfops, ip);
+                       error = xfs_defer_finish(tpp, tp->t_dfops);
+                       tp = *tpp;
                        if (error)
                                goto out_defer;
 
        return 0;
 
 out_defer:
-       xfs_defer_cancel(&dfops);
+       xfs_defer_cancel(tp->t_dfops);
 out:
        trace_xfs_swap_extent_rmap_error(ip, error, _RET_IP_);
        tip->i_d.di_flags2 = tip_flags2;
 {
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_trans        *tp;
+       struct xfs_defer_ops    dfops;
        struct xfs_bstat        *sbp = &sxp->sx_stat;
        int                     src_log_flags, target_log_flags;
        int                     error = 0;
        struct xfs_ifork        *cowfp;
        uint64_t                f;
        int                     resblks = 0;
+       xfs_fsblock_t           firstfsb;
 
        /*
         * Lock the inodes against other IO, page faults and truncate to
        error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, resblks, 0, 0, &tp);
        if (error)
                goto out_unlock;
+       xfs_defer_init(&dfops, &firstfsb);
+       tp->t_dfops = &dfops;
 
        /*
         * Lock and join the inodes to the tansaction so that transaction commit