Message ID | 20210902095927.911100-2-david@fromorbit.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | xfs: intent item whiteouts | expand |
On 9/2/21 2:59 AM, 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> Ok, this is pretty straight forward and makes a lot of sense Reviewed-by: Allison Henderson <allison.henderson@oracle.com> > --- > fs/xfs/xfs_attr_item.c | 4 +++- > 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 +++++++++++++------------ > 6 files changed, 28 insertions(+), 17 deletions(-) > > diff --git a/fs/xfs/xfs_attr_item.c b/fs/xfs/xfs_attr_item.c > index bd4089eb8087..f900001e8f3a 100644 > --- a/fs/xfs/xfs_attr_item.c > +++ b/fs/xfs/xfs_attr_item.c > @@ -479,7 +479,8 @@ xfs_trans_get_attrd(struct xfs_trans *tp, > } > > static const struct xfs_item_ops xfs_attrd_item_ops = { > - .flags = XFS_ITEM_RELEASE_WHEN_COMMITTED, > + .flags = XFS_ITEM_RELEASE_WHEN_COMMITTED | > + XFS_ITEM_INTENT_DONE, > .iop_size = xfs_attrd_item_size, > .iop_format = xfs_attrd_item_format, > .iop_release = xfs_attrd_item_release, > @@ -684,6 +685,7 @@ xfs_attri_item_relog( > } > > static const struct xfs_item_ops xfs_attri_item_ops = { > + .flags = XFS_ITEM_INTENT, > .iop_size = xfs_attri_item_size, > .iop_format = xfs_attri_item_format, > .iop_unpin = xfs_attri_item_unpin, > diff --git a/fs/xfs/xfs_bmap_item.c b/fs/xfs/xfs_bmap_item.c > index 51ba8ee368ca..8de644a343b5 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, > @@ -584,6 +585,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 046f21338c48..952a46477907 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, > @@ -681,6 +682,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 a6e7351ca4f9..38b38a734fd6 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 8c70a4af80a9..1b3655090113 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 2d1cc1ff93c7..ab6e0bc1df1a 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); > >
diff --git a/fs/xfs/xfs_attr_item.c b/fs/xfs/xfs_attr_item.c index bd4089eb8087..f900001e8f3a 100644 --- a/fs/xfs/xfs_attr_item.c +++ b/fs/xfs/xfs_attr_item.c @@ -479,7 +479,8 @@ xfs_trans_get_attrd(struct xfs_trans *tp, } static const struct xfs_item_ops xfs_attrd_item_ops = { - .flags = XFS_ITEM_RELEASE_WHEN_COMMITTED, + .flags = XFS_ITEM_RELEASE_WHEN_COMMITTED | + XFS_ITEM_INTENT_DONE, .iop_size = xfs_attrd_item_size, .iop_format = xfs_attrd_item_format, .iop_release = xfs_attrd_item_release, @@ -684,6 +685,7 @@ xfs_attri_item_relog( } static const struct xfs_item_ops xfs_attri_item_ops = { + .flags = XFS_ITEM_INTENT, .iop_size = xfs_attri_item_size, .iop_format = xfs_attri_item_format, .iop_unpin = xfs_attri_item_unpin, diff --git a/fs/xfs/xfs_bmap_item.c b/fs/xfs/xfs_bmap_item.c index 51ba8ee368ca..8de644a343b5 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, @@ -584,6 +585,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 046f21338c48..952a46477907 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, @@ -681,6 +682,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 a6e7351ca4f9..38b38a734fd6 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 8c70a4af80a9..1b3655090113 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 2d1cc1ff93c7..ab6e0bc1df1a 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);