xfs: add log item flags to indicate intents
authorDave Chinner <dchinner@redhat.com>
Wed, 4 May 2022 01:46:09 +0000 (11:46 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 4 May 2022 01:46:09 +0000 (11:46 +1000)
We currently have a couple of helper functions that try to infer
whether the log item is an intent or intent done item from the
combinations of operations it supports.  This is incredibly fragile
and not very efficient as it requires checking specific combinations
of ops.

We need to be able to identify intent and intent done items quickly
and easily in upcoming patches, so simply add intent and intent done
type flags to the log item ops flags. These are static flags to
begin with, so intent items should have been typed like this from
the start.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_bmap_item.c
fs/xfs/xfs_extfree_item.c
fs/xfs/xfs_refcount_item.c
fs/xfs/xfs_rmap_item.c
fs/xfs/xfs_trans.h

index 2c8b686e2a1118b05b1205fbeafc9b42a7dd8311..0e0aae83308c9060658b2e1f64f313ff5695f7b8 100644 (file)
@@ -204,7 +204,8 @@ xfs_bud_item_release(
 }
 
 static const struct xfs_item_ops xfs_bud_item_ops = {
-       .flags          = XFS_ITEM_RELEASE_WHEN_COMMITTED,
+       .flags          = XFS_ITEM_RELEASE_WHEN_COMMITTED |
+                         XFS_ITEM_INTENT_DONE,
        .iop_size       = xfs_bud_item_size,
        .iop_format     = xfs_bud_item_format,
        .iop_release    = xfs_bud_item_release,
@@ -588,6 +589,7 @@ xfs_bui_item_relog(
 }
 
 static const struct xfs_item_ops xfs_bui_item_ops = {
+       .flags          = XFS_ITEM_INTENT,
        .iop_size       = xfs_bui_item_size,
        .iop_format     = xfs_bui_item_format,
        .iop_unpin      = xfs_bui_item_unpin,
index 0e50f2c9348e196ab39cc33b7fc25d4ca3d96458..21a159f9d8c55b923bf984e7158be3df3457b628 100644 (file)
@@ -307,7 +307,8 @@ xfs_efd_item_release(
 }
 
 static const struct xfs_item_ops xfs_efd_item_ops = {
-       .flags          = XFS_ITEM_RELEASE_WHEN_COMMITTED,
+       .flags          = XFS_ITEM_RELEASE_WHEN_COMMITTED |
+                         XFS_ITEM_INTENT_DONE,
        .iop_size       = xfs_efd_item_size,
        .iop_format     = xfs_efd_item_format,
        .iop_release    = xfs_efd_item_release,
@@ -688,6 +689,7 @@ xfs_efi_item_relog(
 }
 
 static const struct xfs_item_ops xfs_efi_item_ops = {
+       .flags          = XFS_ITEM_INTENT,
        .iop_size       = xfs_efi_item_size,
        .iop_format     = xfs_efi_item_format,
        .iop_unpin      = xfs_efi_item_unpin,
index 10474fe389e13a19288f0b44c7503df59f720ed1..71225d094e033268f45b65120fa5487afafdf5e9 100644 (file)
@@ -210,7 +210,8 @@ xfs_cud_item_release(
 }
 
 static const struct xfs_item_ops xfs_cud_item_ops = {
-       .flags          = XFS_ITEM_RELEASE_WHEN_COMMITTED,
+       .flags          = XFS_ITEM_RELEASE_WHEN_COMMITTED |
+                         XFS_ITEM_INTENT_DONE,
        .iop_size       = xfs_cud_item_size,
        .iop_format     = xfs_cud_item_format,
        .iop_release    = xfs_cud_item_release,
@@ -602,6 +603,7 @@ xfs_cui_item_relog(
 }
 
 static const struct xfs_item_ops xfs_cui_item_ops = {
+       .flags          = XFS_ITEM_INTENT,
        .iop_size       = xfs_cui_item_size,
        .iop_format     = xfs_cui_item_format,
        .iop_unpin      = xfs_cui_item_unpin,
index 6c0b56ebdbe1bd97ec19d9c672e74e21174b4307..6ecbc37e4b8d6bbc67e9b4ed1ccb2b1ff715f0f4 100644 (file)
@@ -233,7 +233,8 @@ xfs_rud_item_release(
 }
 
 static const struct xfs_item_ops xfs_rud_item_ops = {
-       .flags          = XFS_ITEM_RELEASE_WHEN_COMMITTED,
+       .flags          = XFS_ITEM_RELEASE_WHEN_COMMITTED |
+                         XFS_ITEM_INTENT_DONE,
        .iop_size       = xfs_rud_item_size,
        .iop_format     = xfs_rud_item_format,
        .iop_release    = xfs_rud_item_release,
@@ -632,6 +633,7 @@ xfs_rui_item_relog(
 }
 
 static const struct xfs_item_ops xfs_rui_item_ops = {
+       .flags          = XFS_ITEM_INTENT,
        .iop_size       = xfs_rui_item_size,
        .iop_format     = xfs_rui_item_format,
        .iop_unpin      = xfs_rui_item_unpin,
index 87e940b5366e94c10ea2562d062001933cff8c4d..f68e74e460262c73197ad793f43b72fe2c52d1b9 100644 (file)
@@ -80,28 +80,29 @@ struct xfs_item_ops {
                        struct xfs_trans *tp);
 };
 
-/* Is this log item a deferred action intent? */
+/*
+ * Log item ops flags
+ */
+/*
+ * Release the log item when the journal commits instead of inserting into the
+ * AIL for writeback tracking and/or log tail pinning.
+ */
+#define XFS_ITEM_RELEASE_WHEN_COMMITTED        (1 << 0)
+#define XFS_ITEM_INTENT                        (1 << 1)
+#define XFS_ITEM_INTENT_DONE           (1 << 2)
+
 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;
+       return lip->li_ops->flags & XFS_ITEM_INTENT;
 }
 
-/* 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;
+       return lip->li_ops->flags & XFS_ITEM_INTENT_DONE;
 }
 
-/*
- * Release the log item as soon as committed.  This is for items just logging
- * intents that never need to be written back in place.
- */
-#define XFS_ITEM_RELEASE_WHEN_COMMITTED        (1 << 0)
-
 void   xfs_log_item_init(struct xfs_mount *mp, struct xfs_log_item *item,
                          int type, const struct xfs_item_ops *ops);