* reoccur.
  */
 
-static const struct xfs_defer_op_type *defer_op_types[XFS_DEFER_OPS_TYPE_MAX];
+static const struct xfs_defer_op_type *defer_op_types[] = {
+       [XFS_DEFER_OPS_TYPE_BMAP]       = &xfs_bmap_update_defer_type,
+       [XFS_DEFER_OPS_TYPE_REFCOUNT]   = &xfs_refcount_update_defer_type,
+       [XFS_DEFER_OPS_TYPE_RMAP]       = &xfs_rmap_update_defer_type,
+       [XFS_DEFER_OPS_TYPE_FREE]       = &xfs_extent_free_defer_type,
+       [XFS_DEFER_OPS_TYPE_AGFL_FREE]  = &xfs_agfl_free_defer_type,
+};
 
 /*
  * For each pending item in the intake list, log its intent item and the
        struct xfs_defer_pending        *dfp = NULL;
 
        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.
        dfp->dfp_count++;
 }
 
-/* Initialize a deferred operation list. */
-void
-xfs_defer_init_op_type(
-       const struct xfs_defer_op_type  *type)
-{
-       defer_op_types[type->type] = type;
-}
-
 /*
  * Move deferred ops from one transaction to another and reset the source to
  * initial state. This is primarily used to carry state forward across
 
        void (*log_item)(struct xfs_trans *, void *, struct list_head *);
 };
 
-void xfs_defer_init_op_type(const struct xfs_defer_op_type *type);
+extern const struct xfs_defer_op_type xfs_bmap_update_defer_type;
+extern const struct xfs_defer_op_type xfs_refcount_update_defer_type;
+extern const struct xfs_defer_op_type xfs_rmap_update_defer_type;
+extern const struct xfs_defer_op_type xfs_extent_free_defer_type;
+extern const struct xfs_defer_op_type xfs_agfl_free_defer_type;
 
 #endif /* __XFS_DEFER_H__ */
 
 #include "xfs_refcount_item.h"
 #include "xfs_bmap_item.h"
 #include "xfs_reflink.h"
+#include "xfs_defer.h"
 
 #include <linux/namei.h>
 #include <linux/dax.h>
        printk(KERN_INFO XFS_VERSION_STRING " with "
                         XFS_BUILD_OPTIONS " enabled\n");
 
-       xfs_extent_free_init_defer_op();
-       xfs_rmap_update_init_defer_op();
-       xfs_refcount_update_init_defer_op();
-       xfs_bmap_update_init_defer_op();
-
        xfs_dir_startup();
 
        error = xfs_init_zones();
 
 bool           xfs_trans_buf_is_dirty(struct xfs_buf *bp);
 void           xfs_trans_log_inode(xfs_trans_t *, struct xfs_inode *, uint);
 
-void           xfs_extent_free_init_defer_op(void);
 struct xfs_efd_log_item        *xfs_trans_get_efd(struct xfs_trans *,
                                  struct xfs_efi_log_item *,
                                  uint);
 /* rmap updates */
 enum xfs_rmap_intent_type;
 
-void xfs_rmap_update_init_defer_op(void);
 struct xfs_rud_log_item *xfs_trans_get_rud(struct xfs_trans *tp,
                struct xfs_rui_log_item *ruip);
 int xfs_trans_log_finish_rmap_update(struct xfs_trans *tp,
 /* refcount updates */
 enum xfs_refcount_intent_type;
 
-void xfs_refcount_update_init_defer_op(void);
 struct xfs_cud_log_item *xfs_trans_get_cud(struct xfs_trans *tp,
                struct xfs_cui_log_item *cuip);
 int xfs_trans_log_finish_refcount_update(struct xfs_trans *tp,
 /* mapping updates */
 enum xfs_bmap_intent_type;
 
-void xfs_bmap_update_init_defer_op(void);
 struct xfs_bud_log_item *xfs_trans_get_bud(struct xfs_trans *tp,
                struct xfs_bui_log_item *buip);
 int xfs_trans_log_finish_bmap_update(struct xfs_trans *tp,
 
 #include "xfs_alloc.h"
 #include "xfs_bmap.h"
 #include "xfs_inode.h"
+#include "xfs_defer.h"
 
 /*
  * This routine is called to allocate a "bmap update done"
        kmem_free(bmap);
 }
 
-static const struct xfs_defer_op_type xfs_bmap_update_defer_type = {
+const struct xfs_defer_op_type xfs_bmap_update_defer_type = {
        .type           = XFS_DEFER_OPS_TYPE_BMAP,
        .max_items      = XFS_BUI_MAX_FAST_EXTENTS,
        .diff_items     = xfs_bmap_update_diff_items,
        .finish_item    = xfs_bmap_update_finish_item,
        .cancel_item    = xfs_bmap_update_cancel_item,
 };
-
-/* Register the deferred op type. */
-void
-xfs_bmap_update_init_defer_op(void)
-{
-       xfs_defer_init_op_type(&xfs_bmap_update_defer_type);
-}
 
 #include "xfs_alloc.h"
 #include "xfs_bmap.h"
 #include "xfs_trace.h"
+#include "xfs_defer.h"
 
 /*
  * This routine is called to allocate an "extent free done"
        kmem_free(free);
 }
 
-static const struct xfs_defer_op_type xfs_extent_free_defer_type = {
+const struct xfs_defer_op_type xfs_extent_free_defer_type = {
        .type           = XFS_DEFER_OPS_TYPE_FREE,
        .max_items      = XFS_EFI_MAX_FAST_EXTENTS,
        .diff_items     = xfs_extent_free_diff_items,
 
 
 /* sub-type with special handling for AGFL deferred frees */
-static const struct xfs_defer_op_type xfs_agfl_free_defer_type = {
+const struct xfs_defer_op_type xfs_agfl_free_defer_type = {
        .type           = XFS_DEFER_OPS_TYPE_AGFL_FREE,
        .max_items      = XFS_EFI_MAX_FAST_EXTENTS,
        .diff_items     = xfs_extent_free_diff_items,
        .finish_item    = xfs_agfl_free_finish_item,
        .cancel_item    = xfs_extent_free_cancel_item,
 };
-
-/* Register the deferred op type. */
-void
-xfs_extent_free_init_defer_op(void)
-{
-       xfs_defer_init_op_type(&xfs_extent_free_defer_type);
-       xfs_defer_init_op_type(&xfs_agfl_free_defer_type);
-}
 
 #include "xfs_refcount_item.h"
 #include "xfs_alloc.h"
 #include "xfs_refcount.h"
+#include "xfs_defer.h"
 
 /*
  * This routine is called to allocate a "refcount update done"
        kmem_free(refc);
 }
 
-static const struct xfs_defer_op_type xfs_refcount_update_defer_type = {
+const struct xfs_defer_op_type xfs_refcount_update_defer_type = {
        .type           = XFS_DEFER_OPS_TYPE_REFCOUNT,
        .max_items      = XFS_CUI_MAX_FAST_EXTENTS,
        .diff_items     = xfs_refcount_update_diff_items,
        .finish_cleanup = xfs_refcount_update_finish_cleanup,
        .cancel_item    = xfs_refcount_update_cancel_item,
 };
-
-/* Register the deferred op type. */
-void
-xfs_refcount_update_init_defer_op(void)
-{
-       xfs_defer_init_op_type(&xfs_refcount_update_defer_type);
-}
 
 #include "xfs_rmap_item.h"
 #include "xfs_alloc.h"
 #include "xfs_rmap.h"
+#include "xfs_defer.h"
 
 /* Set the map extent flags for this reverse mapping. */
 static void
        kmem_free(rmap);
 }
 
-static const struct xfs_defer_op_type xfs_rmap_update_defer_type = {
+const struct xfs_defer_op_type xfs_rmap_update_defer_type = {
        .type           = XFS_DEFER_OPS_TYPE_RMAP,
        .max_items      = XFS_RUI_MAX_FAST_EXTENTS,
        .diff_items     = xfs_rmap_update_diff_items,
        .finish_cleanup = xfs_rmap_update_finish_cleanup,
        .cancel_item    = xfs_rmap_update_cancel_item,
 };
-
-/* Register the deferred op type. */
-void
-xfs_rmap_update_init_defer_op(void)
-{
-       xfs_defer_init_op_type(&xfs_rmap_update_defer_type);
-}