--- initial
+++ final
@@ -1,92 +1,91 @@
 int                                    /* error code */
 xfs_bmap_add_attrfork(xfs_inode_t *ip, /* incore inode pointer */
                       int size,        /* space new attribute needs */
                       int rsvd)        /* xact may use reserved blks */
 {
   xfs_fsblock_t firstblock;   /* 1st block/ag allocated */
   struct xfs_defer_ops dfops; /* freed extent records */
   xfs_mount_t *mp;            /* mount structure */
   xfs_trans_t *tp;            /* transaction pointer */
   int blks;                   /* space reservation */
   int version = 1;            /* superblock attr version */
   int logflags;               /* logging flags */
   int error;                  /* error return value */
   ASSERT(XFS_IFORK_Q(ip) == 0);
   mp = ip->i_mount;
   ASSERT(!XFS_NOT_DQATTACHED(mp, ip));
   blks = XFS_ADDAFORK_SPACE_RES(mp);
   error = xfs_trans_alloc(mp, &M_RES(mp)->tr_addafork, blks, 0, rsvd ? XFS_TRANS_RESERVE : 0, &tp);
   if (error) return error;
-  xfs_defer_init(&dfops, &firstblock);
-  tp->t_dfops = &dfops;
+  xfs_defer_init(tp, &dfops, &firstblock);
   xfs_ilock(ip, XFS_ILOCK_EXCL);
   error = xfs_trans_reserve_quota_nblks(tp, ip, blks, 0, rsvd ? XFS_QMOPT_RES_REGBLKS | XFS_QMOPT_FORCE_RES : XFS_QMOPT_RES_REGBLKS);
   if (error) goto trans_cancel;
   if (XFS_IFORK_Q(ip)) goto trans_cancel;
   if (ip->i_d.di_anextents != 0) {
     error = -EFSCORRUPTED;
     goto trans_cancel;
   }
   if (ip->i_d.di_aformat != XFS_DINODE_FMT_EXTENTS) {
     /*
      * For inodes coming from pre-6.2 filesystems.
      */
     ASSERT(ip->i_d.di_aformat == 0);
     ip->i_d.di_aformat = XFS_DINODE_FMT_EXTENTS;
   }
   xfs_trans_ijoin(tp, ip, 0);
   xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
   switch (ip->i_d.di_format) {
   case XFS_DINODE_FMT_DEV: ip->i_d.di_forkoff = roundup(sizeof(xfs_dev_t), 8) >> 3; break;
   case XFS_DINODE_FMT_LOCAL:
   case XFS_DINODE_FMT_EXTENTS:
   case XFS_DINODE_FMT_BTREE:
     ip->i_d.di_forkoff = xfs_attr_shortform_bytesfit(ip, size);
     if (!ip->i_d.di_forkoff)
       ip->i_d.di_forkoff = xfs_default_attroffset(ip) >> 3;
     else if (mp->m_flags & XFS_MOUNT_ATTR2)
       version = 2;
     break;
   default:
     ASSERT(0);
     error = -EINVAL;
     goto trans_cancel;
   }
   ASSERT(ip->i_afp == NULL);
   ip->i_afp = kmem_zone_zalloc(xfs_ifork_zone, KM_SLEEP);
   ip->i_afp->if_flags = XFS_IFEXTENTS;
   logflags = 0;
   switch (ip->i_d.di_format) {
   case XFS_DINODE_FMT_LOCAL: error = xfs_bmap_add_attrfork_local(tp, ip, &firstblock, &logflags); break;
   case XFS_DINODE_FMT_EXTENTS: error = xfs_bmap_add_attrfork_extents(tp, ip, &firstblock, &logflags); break;
   case XFS_DINODE_FMT_BTREE: error = xfs_bmap_add_attrfork_btree(tp, ip, &firstblock, &logflags); break;
   default: error = 0; break;
   }
   if (logflags) xfs_trans_log_inode(tp, ip, logflags);
   if (error) goto bmap_cancel;
   if (!xfs_sb_version_hasattr(&mp->m_sb) || (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2)) {
     bool log_sb = false;
     spin_lock(&mp->m_sb_lock);
     if (!xfs_sb_version_hasattr(&mp->m_sb)) {
       xfs_sb_version_addattr(&mp->m_sb);
       log_sb = true;
     }
     if (!xfs_sb_version_hasattr2(&mp->m_sb) && version == 2) {
       xfs_sb_version_addattr2(&mp->m_sb);
       log_sb = true;
     }
     spin_unlock(&mp->m_sb_lock);
     if (log_sb) xfs_log_sb(tp);
   }
   error = xfs_defer_finish(&tp, &dfops);
   if (error) goto bmap_cancel;
   error = xfs_trans_commit(tp);
   xfs_iunlock(ip, XFS_ILOCK_EXCL);
   return error;
 bmap_cancel:
   xfs_defer_cancel(&dfops);
 trans_cancel:
   xfs_trans_cancel(tp);
   xfs_iunlock(ip, XFS_ILOCK_EXCL);
   return error;
 }<sep>@@
expression e1,e2,tp;
@@

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