xfs_defer_cancel_list(mp, &tp->t_dfops);
 }
 
+/*
+ * Return the last pending work item attached to this transaction if it matches
+ * the deferred op type.
+ */
+static inline struct xfs_defer_pending *
+xfs_defer_find_last(
+       struct xfs_trans                *tp,
+       enum xfs_defer_ops_type         type,
+       const struct xfs_defer_op_type  *ops)
+{
+       struct xfs_defer_pending        *dfp = NULL;
+
+       /* No dfops at all? */
+       if (list_empty(&tp->t_dfops))
+               return NULL;
+
+       dfp = list_last_entry(&tp->t_dfops, struct xfs_defer_pending,
+                       dfp_list);
+
+       /* Wrong type? */
+       if (dfp->dfp_type != type)
+               return NULL;
+       return dfp;
+}
+
+/*
+ * Decide if we can add a deferred work item to the last dfops item attached
+ * to the transaction.
+ */
+static inline bool
+xfs_defer_can_append(
+       struct xfs_defer_pending        *dfp,
+       const struct xfs_defer_op_type  *ops)
+{
+       /* Already logged? */
+       if (dfp->dfp_intent)
+               return false;
+
+       /* Already full? */
+       if (ops->max_items && dfp->dfp_count >= ops->max_items)
+               return false;
+
+       return true;
+}
+
 /* Add an item for later deferred processing. */
 void
 xfs_defer_add(
        ASSERT(tp->t_flags & XFS_TRANS_PERM_LOG_RES);
        BUILD_BUG_ON(ARRAY_SIZE(defer_op_types) != XFS_DEFER_OPS_TYPE_MAX);
 
-       /*
-        * Add the item to a pending item at the end of the intake list.
-        * If the last pending item has the same type, reuse it.  Else,
-        * create a new pending item at the end of the intake list.
-        */
-       if (!list_empty(&tp->t_dfops)) {
-               dfp = list_last_entry(&tp->t_dfops,
-                               struct xfs_defer_pending, dfp_list);
-               if (dfp->dfp_type != type ||
-                   (ops->max_items && dfp->dfp_count >= ops->max_items))
-                       dfp = NULL;
-       }
-       if (!dfp) {
+       dfp = xfs_defer_find_last(tp, type, ops);
+       if (!dfp || !xfs_defer_can_append(dfp, ops)) {
+               /* Create a new pending item at the end of the intake list. */
                dfp = kmem_cache_zalloc(xfs_defer_pending_cache,
                                GFP_NOFS | __GFP_NOFAIL);
                dfp->dfp_type = type;