Re: [PATCH 3/8] xfs: add log item flags to indicate intents

Darrick J. Wong
2022-04-27T03:07:09Z

On Wed, Apr 27, 2022 at 12:22:54PM +1000, Dave Chinner wrote:
> From: Dave Chinner <dchinner@redhat.com>
>
> 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>

Heh, I remember being told to infer intentness or intentdoneness instead
of using explicit flags...

Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> ---
> fs/xfs/xfs_bmap_item.c | 4 +++-
> fs/xfs/xfs_extfree_item.c | 4 +++-
> fs/xfs/xfs_refcount_item.c | 4 +++-
> fs/xfs/xfs_rmap_item.c | 4 +++-
> fs/xfs/xfs_trans.h | 25 +++++++++++++------------
> 5 files changed, 25 insertions(+), 16 deletions(-)
>
> diff --git a/fs/xfs/xfs_bmap_item.c b/fs/xfs/xfs_bmap_item.c
> index 593ac29cffc7..ed67c0028a68 100644
> --- a/fs/xfs/xfs_bmap_item.c
> +++ b/fs/xfs/xfs_bmap_item.c
> @@ -202,7 +202,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,
> @@ -586,6 +587,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,
> diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c
> index 0e50f2c9348e..21a159f9d8c5 100644
> --- a/fs/xfs/xfs_extfree_item.c
> +++ b/fs/xfs/xfs_extfree_item.c
> @@ -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,
> diff --git a/fs/xfs/xfs_refcount_item.c b/fs/xfs/xfs_refcount_item.c
> index 0d868c93144d..6536eea4c6ea 100644
> --- a/fs/xfs/xfs_refcount_item.c
> +++ b/fs/xfs/xfs_refcount_item.c
> @@ -208,7 +208,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,
> @@ -600,6 +601,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,
> diff --git a/fs/xfs/xfs_rmap_item.c b/fs/xfs/xfs_rmap_item.c
> index a22b2d19ef91..c2bb8cfc231e 100644
> --- a/fs/xfs/xfs_rmap_item.c
> +++ b/fs/xfs/xfs_rmap_item.c
> @@ -231,7 +231,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,
> @@ -630,6 +631,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,
> diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h
> index 87e940b5366e..f68e74e46026 100644
> --- a/fs/xfs/xfs_trans.h
> +++ b/fs/xfs/xfs_trans.h
> @@ -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);
>
> --
> 2.35.1
>