xfs_extent_t            efi_extents[];  /* array of extents to free */
 } xfs_efi_log_format_t;
 
+static inline size_t
+xfs_efi_log_format_sizeof(
+       unsigned int            nr)
+{
+       return sizeof(struct xfs_efi_log_format) +
+                       nr * sizeof(struct xfs_extent);
+}
+
 typedef struct xfs_efi_log_format_32 {
        uint16_t                efi_type;       /* efi log item type */
        uint16_t                efi_size;       /* size of this item */
        xfs_extent_32_t         efi_extents[];  /* array of extents to free */
 } __attribute__((packed)) xfs_efi_log_format_32_t;
 
+static inline size_t
+xfs_efi_log_format32_sizeof(
+       unsigned int            nr)
+{
+       return sizeof(struct xfs_efi_log_format_32) +
+                       nr * sizeof(struct xfs_extent_32);
+}
+
 typedef struct xfs_efi_log_format_64 {
        uint16_t                efi_type;       /* efi log item type */
        uint16_t                efi_size;       /* size of this item */
        xfs_extent_64_t         efi_extents[];  /* array of extents to free */
 } xfs_efi_log_format_64_t;
 
+static inline size_t
+xfs_efi_log_format64_sizeof(
+       unsigned int            nr)
+{
+       return sizeof(struct xfs_efi_log_format_64) +
+                       nr * sizeof(struct xfs_extent_64);
+}
+
 /*
  * This is the structure used to lay out an efd log item in the
  * log.  The efd_extents array is a variable size array whose
        xfs_extent_t            efd_extents[];  /* array of extents freed */
 } xfs_efd_log_format_t;
 
+static inline size_t
+xfs_efd_log_format_sizeof(
+       unsigned int            nr)
+{
+       return sizeof(struct xfs_efd_log_format) +
+                       nr * sizeof(struct xfs_extent);
+}
+
 typedef struct xfs_efd_log_format_32 {
        uint16_t                efd_type;       /* efd log item type */
        uint16_t                efd_size;       /* size of this item */
        xfs_extent_32_t         efd_extents[];  /* array of extents freed */
 } __attribute__((packed)) xfs_efd_log_format_32_t;
 
+static inline size_t
+xfs_efd_log_format32_sizeof(
+       unsigned int            nr)
+{
+       return sizeof(struct xfs_efd_log_format_32) +
+                       nr * sizeof(struct xfs_extent_32);
+}
+
 typedef struct xfs_efd_log_format_64 {
        uint16_t                efd_type;       /* efd log item type */
        uint16_t                efd_size;       /* size of this item */
        xfs_extent_64_t         efd_extents[];  /* array of extents freed */
 } xfs_efd_log_format_64_t;
 
+static inline size_t
+xfs_efd_log_format64_sizeof(
+       unsigned int            nr)
+{
+       return sizeof(struct xfs_efd_log_format_64) +
+                       nr * sizeof(struct xfs_extent_64);
+}
+
 /*
  * RUI/RUD (reverse mapping) log format definitions
  */
 
        xfs_efi_item_free(efip);
 }
 
-/*
- * This returns the number of iovecs needed to log the given efi item.
- * We only need 1 iovec for an efi item.  It just logs the efi_log_format
- * structure.
- */
-static inline int
-xfs_efi_item_sizeof(
-       struct xfs_efi_log_item *efip)
-{
-       return sizeof(struct xfs_efi_log_format) +
-              efip->efi_format.efi_nextents * sizeof(xfs_extent_t);
-}
-
 STATIC void
 xfs_efi_item_size(
        struct xfs_log_item     *lip,
        int                     *nvecs,
        int                     *nbytes)
 {
+       struct xfs_efi_log_item *efip = EFI_ITEM(lip);
+
        *nvecs += 1;
-       *nbytes += xfs_efi_item_sizeof(EFI_ITEM(lip));
+       *nbytes += xfs_efi_log_format_sizeof(efip->efi_format.efi_nextents);
 }
 
 /*
 
        xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_EFI_FORMAT,
                        &efip->efi_format,
-                       xfs_efi_item_sizeof(efip));
+                       xfs_efi_log_format_sizeof(efip->efi_format.efi_nextents));
 }
 
 
 
 {
        struct xfs_efi_log_item *efip;
-       uint                    size;
 
        ASSERT(nextents > 0);
        if (nextents > XFS_EFI_MAX_FAST_EXTENTS) {
-               size = (uint)(sizeof(struct xfs_efi_log_item) +
-                       (nextents * sizeof(xfs_extent_t)));
-               efip = kmem_zalloc(size, 0);
+               efip = kzalloc(xfs_efi_log_item_sizeof(nextents),
+                               GFP_KERNEL | __GFP_NOFAIL);
        } else {
                efip = kmem_cache_zalloc(xfs_efi_cache,
                                         GFP_KERNEL | __GFP_NOFAIL);
 {
        xfs_efi_log_format_t *src_efi_fmt = buf->i_addr;
        uint i;
-       uint len = sizeof(xfs_efi_log_format_t) +
-               src_efi_fmt->efi_nextents * sizeof(xfs_extent_t);
-       uint len32 = sizeof(xfs_efi_log_format_32_t) +
-               src_efi_fmt->efi_nextents * sizeof(xfs_extent_32_t);
-       uint len64 = sizeof(xfs_efi_log_format_64_t) +
-               src_efi_fmt->efi_nextents * sizeof(xfs_extent_64_t);
+       uint len = xfs_efi_log_format_sizeof(src_efi_fmt->efi_nextents);
+       uint len32 = xfs_efi_log_format32_sizeof(src_efi_fmt->efi_nextents);
+       uint len64 = xfs_efi_log_format64_sizeof(src_efi_fmt->efi_nextents);
 
        if (buf->i_len == len) {
                memcpy(dst_efi_fmt, src_efi_fmt,
                kmem_cache_free(xfs_efd_cache, efdp);
 }
 
-/*
- * This returns the number of iovecs needed to log the given efd item.
- * We only need 1 iovec for an efd item.  It just logs the efd_log_format
- * structure.
- */
-static inline int
-xfs_efd_item_sizeof(
-       struct xfs_efd_log_item *efdp)
-{
-       return sizeof(xfs_efd_log_format_t) +
-              efdp->efd_format.efd_nextents * sizeof(xfs_extent_t);
-}
-
 STATIC void
 xfs_efd_item_size(
        struct xfs_log_item     *lip,
        int                     *nvecs,
        int                     *nbytes)
 {
+       struct xfs_efd_log_item *efdp = EFD_ITEM(lip);
+
        *nvecs += 1;
-       *nbytes += xfs_efd_item_sizeof(EFD_ITEM(lip));
+       *nbytes += xfs_efd_log_format_sizeof(efdp->efd_format.efd_nextents);
 }
 
 /*
 
        xlog_copy_iovec(lv, &vecp, XLOG_REG_TYPE_EFD_FORMAT,
                        &efdp->efd_format,
-                       xfs_efd_item_sizeof(efdp));
+                       xfs_efd_log_format_sizeof(efdp->efd_format.efd_nextents));
 }
 
 /*
        ASSERT(nextents > 0);
 
        if (nextents > XFS_EFD_MAX_FAST_EXTENTS) {
-               efdp = kmem_zalloc(sizeof(struct xfs_efd_log_item) +
-                               nextents * sizeof(struct xfs_extent),
-                               0);
+               efdp = kzalloc(xfs_efd_log_item_sizeof(nextents),
+                               GFP_KERNEL | __GFP_NOFAIL);
        } else {
                efdp = kmem_cache_zalloc(xfs_efd_cache,
                                        GFP_KERNEL | __GFP_NOFAIL);
 
        efi_formatp = item->ri_buf[0].i_addr;
 
-       if (item->ri_buf[0].i_len <
-                       offsetof(struct xfs_efi_log_format, efi_extents)) {
+       if (item->ri_buf[0].i_len < xfs_efi_log_format_sizeof(0)) {
                XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
                return -EFSCORRUPTED;
        }
        struct xfs_efd_log_format       *efd_formatp;
 
        efd_formatp = item->ri_buf[0].i_addr;
-       ASSERT((item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_32_t) +
-               (efd_formatp->efd_nextents * sizeof(xfs_extent_32_t)))) ||
-              (item->ri_buf[0].i_len == (sizeof(xfs_efd_log_format_64_t) +
-               (efd_formatp->efd_nextents * sizeof(xfs_extent_64_t)))));
+       ASSERT(item->ri_buf[0].i_len == xfs_efd_log_format32_sizeof(
+                                               efd_formatp->efd_nextents) ||
+              item->ri_buf[0].i_len == xfs_efd_log_format64_sizeof(
+                                               efd_formatp->efd_nextents));
 
        xlog_recover_release_intent(log, XFS_LI_EFI, efd_formatp->efd_efi_id);
        return 0;
 
                goto out_destroy_trans_cache;
 
        xfs_efd_cache = kmem_cache_create("xfs_efd_item",
-                                       (sizeof(struct xfs_efd_log_item) +
-                                       XFS_EFD_MAX_FAST_EXTENTS *
-                                       sizeof(struct xfs_extent)),
-                                       0, 0, NULL);
+                       xfs_efd_log_item_sizeof(XFS_EFD_MAX_FAST_EXTENTS),
+                       0, 0, NULL);
        if (!xfs_efd_cache)
                goto out_destroy_buf_item_cache;
 
        xfs_efi_cache = kmem_cache_create("xfs_efi_item",
-                                        (sizeof(struct xfs_efi_log_item) +
-                                        XFS_EFI_MAX_FAST_EXTENTS *
-                                        sizeof(struct xfs_extent)),
-                                        0, 0, NULL);
+                       xfs_efi_log_item_sizeof(XFS_EFI_MAX_FAST_EXTENTS),
+                       0, 0, NULL);
        if (!xfs_efi_cache)
                goto out_destroy_efd_cache;