]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: convert "skip_discard" to a proper flags bitset
authorDarrick J. Wong <djwong@kernel.org>
Tue, 2 Jul 2024 18:22:51 +0000 (11:22 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 2 Jul 2024 18:37:01 +0000 (11:37 -0700)
Convert the boolean to skip discard on free into a proper flags field so
that we can add more flags in the next patch.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
12 files changed:
fs/xfs/libxfs/xfs_ag.c
fs/xfs/libxfs/xfs_alloc.c
fs/xfs/libxfs/xfs_alloc.h
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_bmap_btree.c
fs/xfs/libxfs/xfs_ialloc.c
fs/xfs/libxfs/xfs_ialloc_btree.c
fs/xfs/libxfs/xfs_refcount.c
fs/xfs/libxfs/xfs_refcount_btree.c
fs/xfs/scrub/newbt.c
fs/xfs/scrub/reap.c
fs/xfs/xfs_reflink.c

index 240e079cb3fbb9f7d3809f93b19b1e42f6faf5c3..7e80732cb54708c56cb2e22d9265a4cefcb75e25 100644 (file)
@@ -1008,7 +1008,7 @@ xfs_ag_shrink_space(
                        goto resv_err;
 
                err2 = xfs_free_extent_later(*tpp, args.fsbno, delta, NULL,
-                               XFS_AG_RESV_NONE, true);
+                               XFS_AG_RESV_NONE, XFS_FREE_EXTENT_SKIP_DISCARD);
                if (err2)
                        goto resv_err;
 
index 4d4fc37d738c3c625db1462aeeebf5869e9993b8..089031151eedaf887e1bfbc6c114edba5183163d 100644 (file)
@@ -2562,7 +2562,7 @@ xfs_defer_extent_free(
        xfs_filblks_t                   len,
        const struct xfs_owner_info     *oinfo,
        enum xfs_ag_resv_type           type,
-       bool                            skip_discard,
+       unsigned int                    free_flags,
        struct xfs_defer_pending        **dfpp)
 {
        struct xfs_extent_free_item     *xefi;
@@ -2582,6 +2582,7 @@ xfs_defer_extent_free(
        ASSERT(len < mp->m_sb.sb_agblocks);
        ASSERT(agbno + len <= mp->m_sb.sb_agblocks);
 #endif
+       ASSERT(!(free_flags & ~XFS_FREE_EXTENT_ALL_FLAGS));
        ASSERT(xfs_extfree_item_cache != NULL);
        ASSERT(type != XFS_AG_RESV_AGFL);
 
@@ -2593,7 +2594,7 @@ xfs_defer_extent_free(
        xefi->xefi_startblock = bno;
        xefi->xefi_blockcount = (xfs_extlen_t)len;
        xefi->xefi_agresv = type;
-       if (skip_discard)
+       if (free_flags & XFS_FREE_EXTENT_SKIP_DISCARD)
                xefi->xefi_flags |= XFS_EFI_SKIP_DISCARD;
        if (oinfo) {
                ASSERT(oinfo->oi_offset == 0);
@@ -2621,11 +2622,11 @@ xfs_free_extent_later(
        xfs_filblks_t                   len,
        const struct xfs_owner_info     *oinfo,
        enum xfs_ag_resv_type           type,
-       bool                            skip_discard)
+       unsigned int                    free_flags)
 {
        struct xfs_defer_pending        *dontcare = NULL;
 
-       return xfs_defer_extent_free(tp, bno, len, oinfo, type, skip_discard,
+       return xfs_defer_extent_free(tp, bno, len, oinfo, type, free_flags,
                        &dontcare);
 }
 
@@ -2650,13 +2651,13 @@ xfs_free_extent_later(
 int
 xfs_alloc_schedule_autoreap(
        const struct xfs_alloc_arg      *args,
-       bool                            skip_discard,
+       unsigned int                    free_flags,
        struct xfs_alloc_autoreap       *aarp)
 {
        int                             error;
 
        error = xfs_defer_extent_free(args->tp, args->fsbno, args->len,
-                       &args->oinfo, args->resv, skip_discard, &aarp->dfp);
+                       &args->oinfo, args->resv, free_flags, &aarp->dfp);
        if (error)
                return error;
 
index 3dc8e44fea76b16d5c54677da7dbc1bd82c3df20..7f51b3cb03492cdbe757e0d26c7dc01d9c74665c 100644 (file)
@@ -235,7 +235,12 @@ xfs_buf_to_agfl_bno(
 
 int xfs_free_extent_later(struct xfs_trans *tp, xfs_fsblock_t bno,
                xfs_filblks_t len, const struct xfs_owner_info *oinfo,
-               enum xfs_ag_resv_type type, bool skip_discard);
+               enum xfs_ag_resv_type type, unsigned int free_flags);
+
+/* Don't issue a discard for the blocks freed. */
+#define XFS_FREE_EXTENT_SKIP_DISCARD   (1U << 0)
+
+#define XFS_FREE_EXTENT_ALL_FLAGS      (XFS_FREE_EXTENT_SKIP_DISCARD)
 
 /*
  * List of extents to be free "later".
@@ -264,7 +269,7 @@ struct xfs_alloc_autoreap {
 };
 
 int xfs_alloc_schedule_autoreap(const struct xfs_alloc_arg *args,
-               bool skip_discard, struct xfs_alloc_autoreap *aarp);
+               unsigned int free_flags, struct xfs_alloc_autoreap *aarp);
 void xfs_alloc_cancel_autoreap(struct xfs_trans *tp,
                struct xfs_alloc_autoreap *aarp);
 void xfs_alloc_commit_autoreap(struct xfs_trans *tp,
index 09e3302a4b72faf01b4a280dbfc5a97f87b50a9b..7df74c35d9f900d7f4ebad2608b900b578c2e445 100644 (file)
@@ -605,7 +605,7 @@ xfs_bmap_btree_to_extents(
 
        xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, whichfork);
        error = xfs_free_extent_later(cur->bc_tp, cbno, 1, &oinfo,
-                       XFS_AG_RESV_NONE, false);
+                       XFS_AG_RESV_NONE, 0);
        if (error)
                return error;
 
@@ -5381,11 +5381,15 @@ xfs_bmap_del_extent_real(
                        error = xfs_rtfree_blocks(tp, del->br_startblock,
                                        del->br_blockcount);
                } else {
+                       unsigned int    efi_flags = 0;
+
+                       if ((bflags & XFS_BMAPI_NODISCARD) ||
+                           del->br_state == XFS_EXT_UNWRITTEN)
+                               efi_flags |= XFS_FREE_EXTENT_SKIP_DISCARD;
+
                        error = xfs_free_extent_later(tp, del->br_startblock,
                                        del->br_blockcount, NULL,
-                                       XFS_AG_RESV_NONE,
-                                       ((bflags & XFS_BMAPI_NODISCARD) ||
-                                       del->br_state == XFS_EXT_UNWRITTEN));
+                                       XFS_AG_RESV_NONE, efi_flags);
                }
                if (error)
                        return error;
index f5d84dcb58da070118c581be5841e890976583cf..d1b06ccde19ea376bcb17b51900df3d4cdb1b905 100644 (file)
@@ -282,7 +282,7 @@ xfs_bmbt_free_block(
 
        xfs_rmap_ino_bmbt_owner(&oinfo, ip->i_ino, cur->bc_ino.whichfork);
        error = xfs_free_extent_later(cur->bc_tp, fsbno, 1, &oinfo,
-                       XFS_AG_RESV_NONE, false);
+                       XFS_AG_RESV_NONE, 0);
        if (error)
                return error;
 
index f8d5ed7aedde89b434ee59801e6825a716a232a0..0af5b7a33d0554e7018ab338cb97a48760089930 100644 (file)
@@ -1990,7 +1990,7 @@ xfs_difree_inode_chunk(
                return xfs_free_extent_later(tp,
                                XFS_AGB_TO_FSB(mp, agno, sagbno),
                                M_IGEO(mp)->ialloc_blks, &XFS_RMAP_OINFO_INODES,
-                               XFS_AG_RESV_NONE, false);
+                               XFS_AG_RESV_NONE, 0);
        }
 
        /* holemask is only 16-bits (fits in an unsigned long) */
@@ -2036,8 +2036,7 @@ xfs_difree_inode_chunk(
                ASSERT(contigblk % mp->m_sb.sb_spino_align == 0);
                error = xfs_free_extent_later(tp,
                                XFS_AGB_TO_FSB(mp, agno, agbno), contigblk,
-                               &XFS_RMAP_OINFO_INODES, XFS_AG_RESV_NONE,
-                               false);
+                               &XFS_RMAP_OINFO_INODES, XFS_AG_RESV_NONE, 0);
                if (error)
                        return error;
 
index 42e9fd47f6c737a175a3b21afd2100e9921cf1b8..496e2f72a85b9869186c4f92a39339283c70292a 100644 (file)
@@ -170,7 +170,7 @@ __xfs_inobt_free_block(
        xfs_inobt_mod_blockcount(cur, -1);
        fsbno = XFS_DADDR_TO_FSB(cur->bc_mp, xfs_buf_daddr(bp));
        return xfs_free_extent_later(cur->bc_tp, fsbno, 1,
-                       &XFS_RMAP_OINFO_INOBT, resv, false);
+                       &XFS_RMAP_OINFO_INOBT, resv, 0);
 }
 
 STATIC int
index 511c912d515c9d375011b4768d958698b8b8fcb4..4d8bb760c7235811f2414c2fa7a7300391ca9cce 100644 (file)
@@ -1173,7 +1173,7 @@ xfs_refcount_adjust_extents(
                                                tmp.rc_startblock);
                                error = xfs_free_extent_later(cur->bc_tp, fsbno,
                                                  tmp.rc_blockcount, NULL,
-                                                 XFS_AG_RESV_NONE, false);
+                                                 XFS_AG_RESV_NONE, 0);
                                if (error)
                                        goto out_error;
                        }
@@ -1237,7 +1237,7 @@ xfs_refcount_adjust_extents(
                                        ext.rc_startblock);
                        error = xfs_free_extent_later(cur->bc_tp, fsbno,
                                        ext.rc_blockcount, NULL,
-                                       XFS_AG_RESV_NONE, false);
+                                       XFS_AG_RESV_NONE, 0);
                        if (error)
                                goto out_error;
                }
@@ -2022,7 +2022,7 @@ xfs_refcount_recover_cow_leftovers(
                /* Free the block. */
                error = xfs_free_extent_later(tp, fsb,
                                rr->rr_rrec.rc_blockcount, NULL,
-                               XFS_AG_RESV_NONE, false);
+                               XFS_AG_RESV_NONE, 0);
                if (error)
                        goto out_trans;
 
index ca59f6c89f3e3af629aa6c12a79604e9b7233932..cb3b1d42ae9a88720174e98e28849a73a25f8355 100644 (file)
@@ -109,7 +109,7 @@ xfs_refcountbt_free_block(
        be32_add_cpu(&agf->agf_refcount_blocks, -1);
        xfs_alloc_log_agf(cur->bc_tp, agbp, XFS_AGF_REFCOUNT_BLOCKS);
        return xfs_free_extent_later(cur->bc_tp, fsbno, 1,
-                       &XFS_RMAP_OINFO_REFC, XFS_AG_RESV_METADATA, false);
+                       &XFS_RMAP_OINFO_REFC, XFS_AG_RESV_METADATA, 0);
 }
 
 STATIC int
index 4a0271123d94ea0d7aa583ffbcefd6b6b205bda8..2aa14b7ab6306021c9a06bb2d507558b58711b93 100644 (file)
@@ -160,7 +160,8 @@ xrep_newbt_add_blocks(
        if (args->tp) {
                ASSERT(xnr->oinfo.oi_offset == 0);
 
-               error = xfs_alloc_schedule_autoreap(args, true, &resv->autoreap);
+               error = xfs_alloc_schedule_autoreap(args,
+                               XFS_FREE_EXTENT_SKIP_DISCARD, &resv->autoreap);
                if (error)
                        goto out_pag;
        }
@@ -414,7 +415,7 @@ xrep_newbt_free_extent(
         */
        fsbno = XFS_AGB_TO_FSB(sc->mp, resv->pag->pag_agno, free_agbno);
        error = xfs_free_extent_later(sc->tp, fsbno, free_aglen, &xnr->oinfo,
-                       xnr->resv, true);
+                       xnr->resv, XFS_FREE_EXTENT_SKIP_DISCARD);
        if (error)
                return error;
 
index be283153c254e3e2d4bb275d437364216db6b78b..53697f3c5e1b0b4ce78f8ab55806ff635d6e0b52 100644 (file)
@@ -451,7 +451,7 @@ xreap_agextent_iter(
 
                xfs_refcount_free_cow_extent(sc->tp, fsbno, *aglenp);
                error = xfs_free_extent_later(sc->tp, fsbno, *aglenp, NULL,
-                               rs->resv, true);
+                               rs->resv, XFS_FREE_EXTENT_SKIP_DISCARD);
                if (error)
                        return error;
 
@@ -477,7 +477,7 @@ xreap_agextent_iter(
         * system with large EFIs.
         */
        error = xfs_free_extent_later(sc->tp, fsbno, *aglenp, rs->oinfo,
-                       rs->resv, true);
+                       rs->resv, XFS_FREE_EXTENT_SKIP_DISCARD);
        if (error)
                return error;
 
@@ -943,7 +943,8 @@ xrep_reap_bmapi_iter(
        xfs_trans_mod_dquot_byino(sc->tp, ip, XFS_TRANS_DQ_BCOUNT,
                        -(int64_t)imap->br_blockcount);
        return xfs_free_extent_later(sc->tp, imap->br_startblock,
-                       imap->br_blockcount, NULL, XFS_AG_RESV_NONE, true);
+                       imap->br_blockcount, NULL, XFS_AG_RESV_NONE,
+                       XFS_FREE_EXTENT_SKIP_DISCARD);
 }
 
 /*
index 265a2a418bc7b098a595237dbbf3a7931a66e94d..6fde6ec8092f0b96f1fcd084a4feeea4811ba898 100644 (file)
@@ -603,7 +603,7 @@ xfs_reflink_cancel_cow_blocks(
 
                        error = xfs_free_extent_later(*tpp, del.br_startblock,
                                        del.br_blockcount, NULL,
-                                       XFS_AG_RESV_NONE, false);
+                                       XFS_AG_RESV_NONE, 0);
                        if (error)
                                break;