--- initial
+++ final
@@ -1,93 +1,92 @@
 int xfs_remove(xfs_inode_t *dp, struct xfs_name *name, xfs_inode_t *ip) {
   xfs_mount_t *mp = dp->i_mount;
   xfs_trans_t *tp = NULL;
   int is_dir = S_ISDIR(VFS_I(ip)->i_mode);
   int error = 0;
   struct xfs_defer_ops dfops;
   xfs_fsblock_t first_block;
   uint resblks;
   trace_xfs_remove(dp, name);
   if (XFS_FORCED_SHUTDOWN(mp)) return -EIO;
   error = xfs_qm_dqattach(dp);
   if (error) goto std_return;
   error = xfs_qm_dqattach(ip);
   if (error) goto std_return;
   /*
    * We try to get the real space reservation first,
    * allowing for directory btree deletion(s) implying
    * possible bmap insert(s).  If we can't get the space
    * reservation then we use 0 instead, and avoid the bmap
    * btree insert(s) in the directory code by, if the bmap
    * insert tries to happen, instead trimming the LAST
    * block from the directory.
    */
   resblks = XFS_REMOVE_SPACE_RES(mp);
   error = xfs_trans_alloc(mp, &M_RES(mp)->tr_remove, resblks, 0, 0, &tp);
   if (error == -ENOSPC) {
     resblks = 0;
     error = xfs_trans_alloc(mp, &M_RES(mp)->tr_remove, 0, 0, 0, &tp);
   }
   if (error) {
     ASSERT(error != -ENOSPC);
     goto std_return;
   }
   xfs_lock_two_inodes(dp, XFS_ILOCK_EXCL, ip, XFS_ILOCK_EXCL);
   xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
   xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
   /*
    * If we're removing a directory perform some additional validation.
    */
   if (is_dir) {
     ASSERT(VFS_I(ip)->i_nlink >= 2);
     if (VFS_I(ip)->i_nlink != 2) {
       error = -ENOTEMPTY;
       goto out_trans_cancel;
     }
     if (!xfs_dir_isempty(ip)) {
       error = -ENOTEMPTY;
       goto out_trans_cancel;
     }
     /* Drop the link from ip's "..".  */
     error = xfs_droplink(tp, dp);
     if (error) goto out_trans_cancel;
     /* Drop the "." link from ip to self.  */
     error = xfs_droplink(tp, ip);
     if (error) goto out_trans_cancel;
   } else {
     /*
      * When removing a non-directory we need to log the parent
      * inode here.  For a directory this is done implicitly
      * by the xfs_droplink call for the ".." entry.
      */
     xfs_trans_log_inode(tp, dp, XFS_ILOG_CORE);
   }
   xfs_trans_ichgtime(tp, dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
   /* Drop the link from dp to ip. */
   error = xfs_droplink(tp, ip);
   if (error) goto out_trans_cancel;
-  xfs_defer_init(&dfops, &first_block);
-  tp->t_dfops = &dfops;
+  xfs_defer_init(tp, &dfops, &first_block);
   error = xfs_dir_removename(tp, dp, name, ip->i_ino, &first_block, resblks);
   if (error) {
     ASSERT(error != -ENOENT);
     goto out_bmap_cancel;
   }
   /*
    * If this is a synchronous mount, make sure that the
    * remove transaction goes to disk before returning to
    * the user.
    */
   if (mp->m_flags & (XFS_MOUNT_WSYNC | XFS_MOUNT_DIRSYNC)) xfs_trans_set_sync(tp);
   error = xfs_defer_finish(&tp, &dfops);
   if (error) goto out_bmap_cancel;
   error = xfs_trans_commit(tp);
   if (error) goto std_return;
   if (is_dir && xfs_inode_is_filestream(ip)) xfs_filestream_deassociate(ip);
   return 0;
 out_bmap_cancel:
   xfs_defer_cancel(&dfops);
 out_trans_cancel:
   xfs_trans_cancel(tp);
 std_return:
   return error;
 }<sep>@@
expression e1,e2,tp;
@@

-		xfs_defer_init(e1, e2);
-		(tp)->t_dfops = e1;
+		xfs_defer_init(tp, e1, e2);