--- initial
+++ final
@@ -1,91 +1,90 @@
 STATIC int xfs_growfs_rt_alloc(struct xfs_mount *mp, /* file system mount point */
                                xfs_extlen_t oblocks, /* old count of blocks */
                                xfs_extlen_t nblocks, /* new count of blocks */
                                struct xfs_inode *ip) /* inode (bitmap/summary) */
 {
   xfs_fileoff_t bno;          /* block number in file */
   struct xfs_buf *bp;         /* temporary buffer for zeroing */
   xfs_daddr_t d;              /* disk block address */
   int error;                  /* error return value */
   xfs_fsblock_t firstblock;   /* first block allocated in xaction */
   struct xfs_defer_ops dfops; /* list of freed blocks */
   xfs_fsblock_t fsbno;        /* filesystem block for bno */
   struct xfs_bmbt_irec map;   /* block map output */
   int nmap;                   /* number of block maps */
   int resblks;                /* space reservation */
   struct xfs_trans *tp;
   /*
    * Allocate space to the file, as necessary.
    */
   while (oblocks < nblocks) {
     resblks = XFS_GROWFSRT_SPACE_RES(mp, nblocks - oblocks);
     /*
      * Reserve space & log for one extent added to the file.
      */
     error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtalloc, resblks, 0, 0, &tp);
     if (error) return error;
     /*
      * Lock the inode.
      */
     xfs_ilock(ip, XFS_ILOCK_EXCL);
     xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
-    xfs_defer_init(&dfops, &firstblock);
-    tp->t_dfops = &dfops;
+    xfs_defer_init(tp, &dfops, &firstblock);
     /*
      * Allocate blocks to the bitmap file.
      */
     nmap = 1;
     error = xfs_bmapi_write(tp, ip, oblocks, nblocks - oblocks, XFS_BMAPI_METADATA, &firstblock, resblks, &map, &nmap);
     if (!error && nmap < 1) error = -ENOSPC;
     if (error) goto out_bmap_cancel;
     /*
      * Free any blocks freed up in the transaction, then commit.
      */
     error = xfs_defer_finish(&tp, tp->t_dfops);
     if (error) goto out_bmap_cancel;
     error = xfs_trans_commit(tp);
     if (error) return error;
     /*
      * Now we need to clear the allocated blocks.
      * Do this one block per transaction, to keep it simple.
      */
     for (bno = map.br_startoff, fsbno = map.br_startblock; bno < map.br_startoff + map.br_blockcount; bno++, fsbno++) {
       /*
        * Reserve log for one block zeroing.
        */
       error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtzero, 0, 0, 0, &tp);
       if (error) return error;
       /*
        * Lock the bitmap inode.
        */
       xfs_ilock(ip, XFS_ILOCK_EXCL);
       xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
       /*
        * Get a buffer for the block.
        */
       d = XFS_FSB_TO_DADDR(mp, fsbno);
       bp = xfs_trans_get_buf(tp, mp->m_ddev_targp, d, mp->m_bsize, 0);
       if (bp == NULL) {
         error = -EIO;
         goto out_trans_cancel;
       }
       memset(bp->b_addr, 0, mp->m_sb.sb_blocksize);
       xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1);
       /*
        * Commit the transaction.
        */
       error = xfs_trans_commit(tp);
       if (error) return error;
     }
     /*
      * Go on to the next extent, if any.
      */
     oblocks = map.br_startoff + map.br_blockcount;
   }
   return 0;
 out_bmap_cancel:
   xfs_defer_cancel(tp->t_dfops);
 out_trans_cancel:
   xfs_trans_cancel(tp);
   return error;
 }<sep>@@
expression e1,e2,tp;
@@

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