]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
xfs: do the assert for all the log done items in xfs_trans_cancel
authorKaixu Xia <kaixuxia@tencent.com>
Wed, 23 Sep 2020 16:13:28 +0000 (09:13 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Fri, 25 Sep 2020 18:34:07 +0000 (11:34 -0700)
We should do the assert for all the log intent-done items if they appear
here. This patch detect intent-done items by the fact that their item ops
don't have iop_unpin and iop_push methods and also move the helper
xlog_item_is_intent to xfs_trans.h.

Signed-off-by: Kaixu Xia <kaixuxia@tencent.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
fs/xfs/xfs_log_recover.c
fs/xfs/xfs_trans.c
fs/xfs/xfs_trans.h

index 12cde89c090b492e98dfcf853c8a38d65ca513da..e0675071b39e07fb37cec2dd83d594a592ed1d64 100644 (file)
@@ -2465,13 +2465,6 @@ xlog_finish_defer_ops(
        return xfs_trans_commit(tp);
 }
 
-/* Is this log item a deferred action intent? */
-static inline bool xlog_item_is_intent(struct xfs_log_item *lip)
-{
-       return lip->li_ops->iop_recover != NULL &&
-              lip->li_ops->iop_match != NULL;
-}
-
 /*
  * When this is called, all of the log intent items which did not have
  * corresponding log done items should be in the AIL.  What we do now
index ca18a040336a1d5c9079d8cfeab5d59d12514d94..c94e71f741b67032cd6d33f9c06786f36ebf1490 100644 (file)
@@ -959,7 +959,7 @@ xfs_trans_cancel(
                struct xfs_log_item *lip;
 
                list_for_each_entry(lip, &tp->t_items, li_trans)
-                       ASSERT(!(lip->li_type == XFS_LI_EFD));
+                       ASSERT(!xlog_item_is_intent_done(lip));
        }
 #endif
        xfs_trans_unreserve_and_mod_sb(tp);
index f46534b7523698033d8a44865131ce58419ccd57..a71b4f443e39191d29c3f4cbc8d57173ef10bc24 100644 (file)
@@ -78,6 +78,22 @@ struct xfs_item_ops {
        bool (*iop_match)(struct xfs_log_item *item, uint64_t id);
 };
 
+/* Is this log item a deferred action intent? */
+static inline bool
+xlog_item_is_intent(struct xfs_log_item *lip)
+{
+       return lip->li_ops->iop_recover != NULL &&
+              lip->li_ops->iop_match != NULL;
+}
+
+/* Is this a log intent-done item? */
+static inline bool
+xlog_item_is_intent_done(struct xfs_log_item *lip)
+{
+       return lip->li_ops->iop_unpin == NULL &&
+              lip->li_ops->iop_push == NULL;
+}
+
 /*
  * Release the log item as soon as committed.  This is for items just logging
  * intents that never need to be written back in place.