return error;
 }
 
+static struct xfs_trans *
+__xfs_trans_alloc(
+       struct xfs_mount        *mp,
+       uint                    flags)
+{
+       struct xfs_trans        *tp;
+
+       ASSERT(!(flags & XFS_TRANS_RES_FDBLKS) || xfs_has_lazysbcount(mp));
+
+       tp = kmem_cache_zalloc(xfs_trans_cache, GFP_KERNEL | __GFP_NOFAIL);
+       if (!(flags & XFS_TRANS_NO_WRITECOUNT))
+               sb_start_intwrite(mp->m_super);
+       xfs_trans_set_context(tp);
+       tp->t_flags = flags;
+       tp->t_mountp = mp;
+       INIT_LIST_HEAD(&tp->t_items);
+       INIT_LIST_HEAD(&tp->t_busy);
+       INIT_LIST_HEAD(&tp->t_dfops);
+       tp->t_highest_agno = NULLAGNUMBER;
+       return tp;
+}
+
 int
 xfs_trans_alloc(
        struct xfs_mount        *mp,
        bool                    want_retry = true;
        int                     error;
 
+       ASSERT(resp->tr_logres > 0);
+
        /*
         * Allocate the handle before we do our freeze accounting and setting up
         * GFP_NOFS allocation context so that we avoid lockdep false positives
         * by doing GFP_KERNEL allocations inside sb_start_intwrite().
         */
 retry:
-       tp = kmem_cache_zalloc(xfs_trans_cache, GFP_KERNEL | __GFP_NOFAIL);
-       if (!(flags & XFS_TRANS_NO_WRITECOUNT))
-               sb_start_intwrite(mp->m_super);
-       xfs_trans_set_context(tp);
-
-       /*
-        * Zero-reservation ("empty") transactions can't modify anything, so
-        * they're allowed to run while we're frozen.
-        */
-       WARN_ON(resp->tr_logres > 0 &&
-               mp->m_super->s_writers.frozen == SB_FREEZE_COMPLETE);
-       ASSERT(!(flags & XFS_TRANS_RES_FDBLKS) ||
-              xfs_has_lazysbcount(mp));
-
-       tp->t_flags = flags;
-       tp->t_mountp = mp;
-       INIT_LIST_HEAD(&tp->t_items);
-       INIT_LIST_HEAD(&tp->t_busy);
-       INIT_LIST_HEAD(&tp->t_dfops);
-       tp->t_highest_agno = NULLAGNUMBER;
-
+       WARN_ON(mp->m_super->s_writers.frozen == SB_FREEZE_COMPLETE);
+       tp = __xfs_trans_alloc(mp, flags);
        error = xfs_trans_reserve(tp, resp, blocks, rtextents);
        if (error == -ENOSPC && want_retry) {
                xfs_trans_cancel(tp);
        struct xfs_mount                *mp,
        struct xfs_trans                **tpp)
 {
-       struct xfs_trans_res            resv = {0};
-
-       return xfs_trans_alloc(mp, &resv, 0, 0, XFS_TRANS_NO_WRITECOUNT, tpp);
+       *tpp = __xfs_trans_alloc(mp, XFS_TRANS_NO_WRITECOUNT);
+       return 0;
 }
 
 /*