xfs: hoist intent done flag setting to ->finish_item callsite
authorDarrick J. Wong <djwong@kernel.org>
Thu, 30 Nov 2023 18:45:28 +0000 (10:45 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 7 Dec 2023 02:45:15 +0000 (18:45 -0800)
Each log intent item's ->finish_item call chain inevitably includes some
code to set the dirty flag of the transaction.  If there's an associated
log intent done item, it also sets the item's dirty flag and the
transaction's INTENT_DONE flag.  This is repeated throughout the
codebase.

Reduce the LOC by moving all that to xfs_defer_finish_one.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_defer.c
fs/xfs/xfs_attr_item.c
fs/xfs/xfs_bmap_item.c
fs/xfs/xfs_extfree_item.c
fs/xfs/xfs_refcount_item.c
fs/xfs/xfs_rmap_item.c

index dd565e4e3daf06ada8417c5a417b1566a6df0379..6214abedf3940b3f32dd6f56dca83270d2706036 100644 (file)
@@ -191,6 +191,32 @@ static const struct xfs_defer_op_type *defer_op_types[] = {
        [XFS_DEFER_OPS_TYPE_ATTR]       = &xfs_attr_defer_type,
 };
 
+/* Create a log intent done item for a log intent item. */
+static inline void
+xfs_defer_create_done(
+       struct xfs_trans                *tp,
+       struct xfs_defer_pending        *dfp)
+{
+       const struct xfs_defer_op_type  *ops = defer_op_types[dfp->dfp_type];
+       struct xfs_log_item             *lip;
+
+       /*
+        * Mark the transaction dirty, even on error. This ensures the
+        * transaction is aborted, which:
+        *
+        * 1.) releases the log intent item and frees the log done item
+        * 2.) shuts down the filesystem
+        */
+       tp->t_flags |= XFS_TRANS_DIRTY;
+       lip = ops->create_done(tp, dfp->dfp_intent, dfp->dfp_count);
+       if (!lip)
+               return;
+
+       tp->t_flags |= XFS_TRANS_HAS_INTENT_DONE;
+       set_bit(XFS_LI_DIRTY, &lip->li_flags);
+       dfp->dfp_done = lip;
+}
+
 /*
  * Ensure there's a log intent item associated with this deferred work item if
  * the operation must be restarted on crash.  Returns 1 if there's a log item;
@@ -496,7 +522,7 @@ xfs_defer_finish_one(
 
        trace_xfs_defer_pending_finish(tp->t_mountp, dfp);
 
-       dfp->dfp_done = ops->create_done(tp, dfp->dfp_intent, dfp->dfp_count);
+       xfs_defer_create_done(tp, dfp);
        list_for_each_safe(li, n, &dfp->dfp_work) {
                list_del(li);
                dfp->dfp_count--;
index d19a385f92890a73d07ecd686d7275010256bdea..e7acbb736beed5553652794326ac3c911eaa2e19 100644 (file)
@@ -324,39 +324,17 @@ xfs_xattri_finish_update(
        struct xfs_da_args              *args = attr->xattri_da_args;
        int                             error;
 
-       if (XFS_TEST_ERROR(false, args->dp->i_mount, XFS_ERRTAG_LARP)) {
-               error = -EIO;
-               goto out;
-       }
+       if (XFS_TEST_ERROR(false, args->dp->i_mount, XFS_ERRTAG_LARP))
+               return -EIO;
 
        /* If an attr removal is trivially complete, we're done. */
        if (attr->xattri_op_flags == XFS_ATTRI_OP_FLAGS_REMOVE &&
-           !xfs_inode_hasattr(args->dp)) {
-               error = 0;
-               goto out;
-       }
+           !xfs_inode_hasattr(args->dp))
+               return 0;
 
        error = xfs_attr_set_iter(attr);
        if (!error && attr->xattri_dela_state != XFS_DAS_DONE)
                error = -EAGAIN;
-out:
-       /*
-        * Mark the transaction dirty, even on error. This ensures the
-        * transaction is aborted, which:
-        *
-        * 1.) releases the ATTRI and frees the ATTRD
-        * 2.) shuts down the filesystem
-        */
-       args->trans->t_flags |= XFS_TRANS_DIRTY;
-
-       /*
-        * attr intent/done items are null when logged attributes are disabled
-        */
-       if (attrdp) {
-               args->trans->t_flags |= XFS_TRANS_HAS_INTENT_DONE;
-               set_bit(XFS_LI_DIRTY, &attrdp->attrd_item.li_flags);
-       }
-
        return error;
 }
 
index bd8f6fe22b401355dae1ee66d777b5d0d4aef525..913315cb5123f5be041d45aff2f39f743794a317 100644 (file)
@@ -249,21 +249,7 @@ xfs_trans_log_finish_bmap_update(
        struct xfs_bud_log_item         *budp,
        struct xfs_bmap_intent          *bi)
 {
-       int                             error;
-
-       error = xfs_bmap_finish_one(tp, bi);
-
-       /*
-        * Mark the transaction dirty, even on error. This ensures the
-        * transaction is aborted, which:
-        *
-        * 1.) releases the BUI and frees the BUD
-        * 2.) shuts down the filesystem
-        */
-       tp->t_flags |= XFS_TRANS_DIRTY | XFS_TRANS_HAS_INTENT_DONE;
-       set_bit(XFS_LI_DIRTY, &budp->bud_item.li_flags);
-
-       return error;
+       return xfs_bmap_finish_one(tp, bi);
 }
 
 /* Sort bmap intents by inode. */
index 49e96ffd64e0c1b36c0dd9e6b26a88268f3c487b..e8e02f816cbeb75be91aa1ed283c13d8b859f74e 100644 (file)
@@ -396,16 +396,6 @@ xfs_trans_free_extent(
                        xefi->xefi_blockcount, &oinfo, xefi->xefi_agresv,
                        xefi->xefi_flags & XFS_EFI_SKIP_DISCARD);
 
-       /*
-        * Mark the transaction dirty, even on error. This ensures the
-        * transaction is aborted, which:
-        *
-        * 1.) releases the EFI and frees the EFD
-        * 2.) shuts down the filesystem
-        */
-       tp->t_flags |= XFS_TRANS_DIRTY | XFS_TRANS_HAS_INTENT_DONE;
-       set_bit(XFS_LI_DIRTY, &efdp->efd_item.li_flags);
-
        /*
         * If we need a new transaction to make progress, the caller will log a
         * new EFI with the current contents. It will also log an EFD to cancel
@@ -601,16 +591,6 @@ xfs_agfl_free_finish_item(
                error = xfs_free_agfl_block(tp, xefi->xefi_pag->pag_agno,
                                agbno, agbp, &oinfo);
 
-       /*
-        * Mark the transaction dirty, even on error. This ensures the
-        * transaction is aborted, which:
-        *
-        * 1.) releases the EFI and frees the EFD
-        * 2.) shuts down the filesystem
-        */
-       tp->t_flags |= XFS_TRANS_DIRTY;
-       set_bit(XFS_LI_DIRTY, &efdp->efd_item.li_flags);
-
        next_extent = efdp->efd_next_extent;
        ASSERT(next_extent < efdp->efd_format.efd_nextents);
        extp = &(efdp->efd_format.efd_extents[next_extent]);
index 48f1a38b272e1d10e45fb280903c76531f2953b7..2628b1e3969c98d11759e67c685a5e5f4df80212 100644 (file)
@@ -256,21 +256,7 @@ xfs_trans_log_finish_refcount_update(
        struct xfs_refcount_intent      *ri,
        struct xfs_btree_cur            **pcur)
 {
-       int                             error;
-
-       error = xfs_refcount_finish_one(tp, ri, pcur);
-
-       /*
-        * Mark the transaction dirty, even on error. This ensures the
-        * transaction is aborted, which:
-        *
-        * 1.) releases the CUI and frees the CUD
-        * 2.) shuts down the filesystem
-        */
-       tp->t_flags |= XFS_TRANS_DIRTY | XFS_TRANS_HAS_INTENT_DONE;
-       set_bit(XFS_LI_DIRTY, &cudp->cud_item.li_flags);
-
-       return error;
+       return xfs_refcount_finish_one(tp, ri, pcur);
 }
 
 /* Sort refcount intents by AG. */
index 23684bc2ab85a22541674f36ceae1fe217e54920..8f216a13a7f27c3e55fa5f1a34b075f31d36130a 100644 (file)
@@ -297,21 +297,7 @@ xfs_trans_log_finish_rmap_update(
        struct xfs_rmap_intent          *ri,
        struct xfs_btree_cur            **pcur)
 {
-       int                             error;
-
-       error = xfs_rmap_finish_one(tp, ri, pcur);
-
-       /*
-        * Mark the transaction dirty, even on error. This ensures the
-        * transaction is aborted, which:
-        *
-        * 1.) releases the RUI and frees the RUD
-        * 2.) shuts down the filesystem
-        */
-       tp->t_flags |= XFS_TRANS_DIRTY | XFS_TRANS_HAS_INTENT_DONE;
-       set_bit(XFS_LI_DIRTY, &rudp->rud_item.li_flags);
-
-       return error;
+       return xfs_rmap_finish_one(tp, ri, pcur);
 }
 
 /* Sort rmap intents by AG. */