]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: reduce the size of struct xfs_extent_free_item
authorDarrick J. Wong <djwong@kernel.org>
Thu, 28 Apr 2022 19:39:04 +0000 (15:39 -0400)
committerEric Sandeen <sandeen@sandeen.net>
Thu, 28 Apr 2022 19:39:04 +0000 (15:39 -0400)
Source kernel commit: b3b5ff412ab04afd99173bb12d3cc146ee478ae7

We only use EFIs to free metadata blocks -- not regular data/attr fork
extents.  Remove all the fields that we never use, for a net reduction
of 16 bytes.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
libxfs/defer_item.c
libxfs/xfs_alloc.c
libxfs/xfs_alloc.h

index e7cba8389d4a924ee5d4b380b34a5d5e119a7168..bd6ace1c4e61694b74b55a3cfcefba0d644f7e06 100644 (file)
@@ -75,13 +75,18 @@ xfs_extent_free_finish_item(
        struct list_head                *item,
        struct xfs_btree_cur            **state)
 {
+       struct xfs_owner_info           oinfo = { };
        struct xfs_extent_free_item     *free;
        int                             error;
 
        free = container_of(item, struct xfs_extent_free_item, xefi_list);
+       oinfo.oi_owner = free->xefi_owner;
+       if (free->xefi_flags & XFS_EFI_ATTR_FORK)
+               oinfo.oi_flags |= XFS_OWNER_INFO_ATTR_FORK;
+       if (free->xefi_flags & XFS_EFI_BMBT_BLOCK)
+               oinfo.oi_flags |= XFS_OWNER_INFO_BMBT_BLOCK;
        error = xfs_free_extent(tp, free->xefi_startblock,
-                       free->xefi_blockcount, &free->xefi_oinfo,
-                       XFS_AG_RESV_NONE);
+               free->xefi_blockcount, &oinfo, XFS_AG_RESV_NONE);
        kmem_cache_free(xfs_extfree_item_cache, free);
        return error;
 }
@@ -123,6 +128,7 @@ xfs_agfl_free_finish_item(
        struct list_head                *item,
        struct xfs_btree_cur            **state)
 {
+       struct xfs_owner_info           oinfo = { };
        struct xfs_mount                *mp = tp->t_mountp;
        struct xfs_extent_free_item     *free;
        struct xfs_buf                  *agbp;
@@ -134,11 +140,11 @@ xfs_agfl_free_finish_item(
        ASSERT(free->xefi_blockcount == 1);
        agno = XFS_FSB_TO_AGNO(mp, free->xefi_startblock);
        agbno = XFS_FSB_TO_AGBNO(mp, free->xefi_startblock);
+       oinfo.oi_owner = free->xefi_owner;
 
        error = xfs_alloc_read_agf(mp, tp, agno, 0, &agbp);
        if (!error)
-               error = xfs_free_agfl_block(tp, agno, agbno, agbp,
-                                           &free->xefi_oinfo);
+               error = xfs_free_agfl_block(tp, agno, agbno, agbp, &oinfo);
        kmem_cache_free(xfs_extfree_item_cache, free);
        return error;
 }
index f1da82924affdfc058b7f32981a4db8a7a4e9082..1d5aa67fdc4480591d89a556d30db5ba7f586d2a 100644 (file)
@@ -2458,12 +2458,11 @@ xfs_defer_agfl_block(
        ASSERT(xfs_extfree_item_cache != NULL);
        ASSERT(oinfo != NULL);
 
-       new = kmem_cache_alloc(xfs_extfree_item_cache,
+       new = kmem_cache_zalloc(xfs_extfree_item_cache,
                               GFP_KERNEL | __GFP_NOFAIL);
        new->xefi_startblock = XFS_AGB_TO_FSB(mp, agno, agbno);
        new->xefi_blockcount = 1;
-       new->xefi_oinfo = *oinfo;
-       new->xefi_skip_discard = false;
+       new->xefi_owner = oinfo->oi_owner;
 
        trace_xfs_agfl_free_defer(mp, agno, 0, agbno, 1);
 
@@ -2501,15 +2500,23 @@ __xfs_free_extent_later(
 #endif
        ASSERT(xfs_extfree_item_cache != NULL);
 
-       new = kmem_cache_alloc(xfs_extfree_item_cache,
+       new = kmem_cache_zalloc(xfs_extfree_item_cache,
                               GFP_KERNEL | __GFP_NOFAIL);
        new->xefi_startblock = bno;
        new->xefi_blockcount = (xfs_extlen_t)len;
-       if (oinfo)
-               new->xefi_oinfo = *oinfo;
-       else
-               new->xefi_oinfo = XFS_RMAP_OINFO_SKIP_UPDATE;
-       new->xefi_skip_discard = skip_discard;
+       if (skip_discard)
+               new->xefi_flags |= XFS_EFI_SKIP_DISCARD;
+       if (oinfo) {
+               ASSERT(oinfo->oi_offset == 0);
+
+               if (oinfo->oi_flags & XFS_OWNER_INFO_ATTR_FORK)
+                       new->xefi_flags |= XFS_EFI_ATTR_FORK;
+               if (oinfo->oi_flags & XFS_OWNER_INFO_BMBT_BLOCK)
+                       new->xefi_flags |= XFS_EFI_BMBT_BLOCK;
+               new->xefi_owner = oinfo->oi_owner;
+       } else {
+               new->xefi_owner = XFS_RMAP_OWN_NULL;
+       }
        trace_xfs_bmap_free_defer(tp->t_mountp,
                        XFS_FSB_TO_AGNO(tp->t_mountp, bno), 0,
                        XFS_FSB_TO_AGBNO(tp->t_mountp, bno), len);
index b61aeb6fbe32ce1d808770a4d3cf3b548e1762d1..1c14a0b1abeafb32a4f5167a2759edd5cc54118a 100644 (file)
@@ -258,12 +258,16 @@ void __xfs_free_extent_later(struct xfs_trans *tp, xfs_fsblock_t bno,
  */
 struct xfs_extent_free_item {
        struct list_head        xefi_list;
+       uint64_t                xefi_owner;
        xfs_fsblock_t           xefi_startblock;/* starting fs block number */
        xfs_extlen_t            xefi_blockcount;/* number of blocks in extent */
-       bool                    xefi_skip_discard;
-       struct xfs_owner_info   xefi_oinfo;     /* extent owner */
+       unsigned int            xefi_flags;
 };
 
+#define XFS_EFI_SKIP_DISCARD   (1U << 0) /* don't issue discard */
+#define XFS_EFI_ATTR_FORK      (1U << 1) /* freeing attr fork block */
+#define XFS_EFI_BMBT_BLOCK     (1U << 2) /* freeing bmap btree block */
+
 static inline void
 xfs_free_extent_later(
        struct xfs_trans                *tp,