dfc->dfc_blkres = tp->t_blk_res - tp->t_blk_res_used;
        dfc->dfc_rtxres = tp->t_rtx_res - tp->t_rtx_res_used;
 
+       /* Preserve the log reservation size. */
+       dfc->dfc_logres = tp->t_log_res;
+
        return dfc;
 }
 
 
        int                     error = 0;
 
        list_for_each_entry_safe(dfc, next, capture_list, dfc_list) {
-               error = xfs_trans_alloc(mp, &M_RES(mp)->tr_itruncate,
-                               dfc->dfc_blkres, dfc->dfc_rtxres,
-                               XFS_TRANS_RESERVE, &tp);
+               struct xfs_trans_res    resv;
+
+               /*
+                * Create a new transaction reservation from the captured
+                * information.  Set logcount to 1 to force the new transaction
+                * to regrant every roll so that we can make forward progress
+                * in recovery no matter how full the log might be.
+                */
+               resv.tr_logres = dfc->dfc_logres;
+               resv.tr_logcount = 1;
+               resv.tr_logflags = XFS_TRANS_PERM_LOG_RES;
+
+               error = xfs_trans_alloc(mp, &resv, dfc->dfc_blkres,
+                               dfc->dfc_rtxres, XFS_TRANS_RESERVE, &tp);
                if (error)
                        return error;