| From foo@baz Wed Oct 26 04:49:40 PM CEST 2022 |
| From: Chandan Babu R <chandan.babu@oracle.com> |
| Date: Wed, 26 Oct 2022 11:58:36 +0530 |
| Subject: xfs: factor common AIL item deletion code |
| To: gregkh@linuxfoundation.org |
| Cc: sashal@kernel.org, mcgrof@kernel.org, linux-xfs@vger.kernel.org, stable@vger.kernel.org, djwong@kernel.org, chandan.babu@oracle.com, amir73il@gmail.com, leah.rumancik@gmail.com |
| Message-ID: <20221026062843.927600-20-chandan.babu@oracle.com> |
| |
| From: Dave Chinner <dchinner@redhat.com> |
| |
| commit 4165994ac9672d91134675caa6de3645a9ace6c8 upstream. |
| |
| Factor the common AIL deletion code that does all the wakeups into a |
| helper so we only have one copy of this somewhat tricky code to |
| interface with all the wakeups necessary when the LSN of the log |
| tail changes. |
| |
| Signed-off-by: Dave Chinner <dchinner@redhat.com> |
| Reviewed-by: Christoph Hellwig <hch@lst.de> |
| Reviewed-by: Allison Collins <allison.henderson@oracle.com> |
| Reviewed-by: Brian Foster <bfoster@redhat.com> |
| Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Acked-by: Darrick J. Wong <djwong@kernel.org> |
| Signed-off-by: Chandan Babu R <chandan.babu@oracle.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/xfs/xfs_inode_item.c | 12 +----------- |
| fs/xfs/xfs_trans_ail.c | 48 ++++++++++++++++++++++++++---------------------- |
| fs/xfs/xfs_trans_priv.h | 4 +++- |
| 3 files changed, 30 insertions(+), 34 deletions(-) |
| |
| --- a/fs/xfs/xfs_inode_item.c |
| +++ b/fs/xfs/xfs_inode_item.c |
| @@ -744,17 +744,7 @@ xfs_iflush_done( |
| xfs_clear_li_failed(blip); |
| } |
| } |
| - |
| - if (mlip_changed) { |
| - if (!XFS_FORCED_SHUTDOWN(ailp->ail_mount)) |
| - xlog_assign_tail_lsn_locked(ailp->ail_mount); |
| - if (list_empty(&ailp->ail_head)) |
| - wake_up_all(&ailp->ail_empty); |
| - } |
| - spin_unlock(&ailp->ail_lock); |
| - |
| - if (mlip_changed) |
| - xfs_log_space_wake(ailp->ail_mount); |
| + xfs_ail_update_finish(ailp, mlip_changed); |
| } |
| |
| /* |
| --- a/fs/xfs/xfs_trans_ail.c |
| +++ b/fs/xfs/xfs_trans_ail.c |
| @@ -680,6 +680,27 @@ xfs_ail_push_all_sync( |
| finish_wait(&ailp->ail_empty, &wait); |
| } |
| |
| +void |
| +xfs_ail_update_finish( |
| + struct xfs_ail *ailp, |
| + bool do_tail_update) __releases(ailp->ail_lock) |
| +{ |
| + struct xfs_mount *mp = ailp->ail_mount; |
| + |
| + if (!do_tail_update) { |
| + spin_unlock(&ailp->ail_lock); |
| + return; |
| + } |
| + |
| + if (!XFS_FORCED_SHUTDOWN(mp)) |
| + xlog_assign_tail_lsn_locked(mp); |
| + |
| + if (list_empty(&ailp->ail_head)) |
| + wake_up_all(&ailp->ail_empty); |
| + spin_unlock(&ailp->ail_lock); |
| + xfs_log_space_wake(mp); |
| +} |
| + |
| /* |
| * xfs_trans_ail_update - bulk AIL insertion operation. |
| * |
| @@ -739,15 +760,7 @@ xfs_trans_ail_update_bulk( |
| if (!list_empty(&tmp)) |
| xfs_ail_splice(ailp, cur, &tmp, lsn); |
| |
| - if (mlip_changed) { |
| - if (!XFS_FORCED_SHUTDOWN(ailp->ail_mount)) |
| - xlog_assign_tail_lsn_locked(ailp->ail_mount); |
| - spin_unlock(&ailp->ail_lock); |
| - |
| - xfs_log_space_wake(ailp->ail_mount); |
| - } else { |
| - spin_unlock(&ailp->ail_lock); |
| - } |
| + xfs_ail_update_finish(ailp, mlip_changed); |
| } |
| |
| bool |
| @@ -791,10 +804,10 @@ void |
| xfs_trans_ail_delete( |
| struct xfs_ail *ailp, |
| struct xfs_log_item *lip, |
| - int shutdown_type) __releases(ailp->ail_lock) |
| + int shutdown_type) |
| { |
| struct xfs_mount *mp = ailp->ail_mount; |
| - bool mlip_changed; |
| + bool need_update; |
| |
| if (!test_bit(XFS_LI_IN_AIL, &lip->li_flags)) { |
| spin_unlock(&ailp->ail_lock); |
| @@ -807,17 +820,8 @@ xfs_trans_ail_delete( |
| return; |
| } |
| |
| - mlip_changed = xfs_ail_delete_one(ailp, lip); |
| - if (mlip_changed) { |
| - if (!XFS_FORCED_SHUTDOWN(mp)) |
| - xlog_assign_tail_lsn_locked(mp); |
| - if (list_empty(&ailp->ail_head)) |
| - wake_up_all(&ailp->ail_empty); |
| - } |
| - |
| - spin_unlock(&ailp->ail_lock); |
| - if (mlip_changed) |
| - xfs_log_space_wake(ailp->ail_mount); |
| + need_update = xfs_ail_delete_one(ailp, lip); |
| + xfs_ail_update_finish(ailp, need_update); |
| } |
| |
| int |
| --- a/fs/xfs/xfs_trans_priv.h |
| +++ b/fs/xfs/xfs_trans_priv.h |
| @@ -92,8 +92,10 @@ xfs_trans_ail_update( |
| } |
| |
| bool xfs_ail_delete_one(struct xfs_ail *ailp, struct xfs_log_item *lip); |
| +void xfs_ail_update_finish(struct xfs_ail *ailp, bool do_tail_update) |
| + __releases(ailp->ail_lock); |
| void xfs_trans_ail_delete(struct xfs_ail *ailp, struct xfs_log_item *lip, |
| - int shutdown_type) __releases(ailp->ail_lock); |
| + int shutdown_type); |
| |
| static inline void |
| xfs_trans_ail_remove( |