FAILED: patch "[PATCH] xfs: don't hold buffer locks across sync transaction commit" failed to apply to 5.15-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 5.15-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.15.y
git checkout FETCH_HEAD
git cherry-pick -x 41a28c865d1d5843f8cb9e0af17a8f4d9e2961ff
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026102122-lapdog-celibate-e8d8@gregkh' --subject-prefix 'PATCH 5.15.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 41a28c865d1d5843f8cb9e0af17a8f4d9e2961ff Mon Sep 17 00:00:00 2001
From: Yun Zhou <[email protected]>
Date: Fri, 31 Jul 2026 11:10:10 +0800
Subject: [PATCH] xfs: don't hold buffer locks across sync transaction commit
in xfs_sync_sb_buf
xfs_sync_sb_buf() holds sb/rtsb buffer locks across a synchronous xfs_trans_commit(), which flushes the CIL push workqueue internally. If shutdown occurs during the CIL push, xfs_buf_item_unpin() needs to lock these buffers to fail them, causing a deadlock:
setlabel: holds buf lock -> flush_workqueue(xfs-cil)
CIL push worker: xfs_buf_item_unpin -> xfs_buf_lock(same buf)
Remove the xfs_trans_bhold() calls so that commit releases the buffer locks normally. After the sync commit, re-acquire the buffers via mp->m_sb_bp / mp->m_rtsb_bp for the on-disk writeback.
fs/xfs/libxfs/xfs_rtgroup.h +5 -1
@@ -359,7 +359,11 @@ static inline int xfs_initialize_rtgroups(struct xfs_mount *mp,# define xfs_rtgroup_unlock (rtg, gf) ((void)0)# define xfs_rtgroup_trans_join (tp, rtg, gf) ((void)0)# define xfs_update_rtsb (bp, sb_bp) ((void)0) -# define xfs_log_rtsb (tp, sb_bp) (NULL) +static inline struct xfs_buf *xfs_log_rtsb (struct xfs_trans *tp, +const struct xfs_buf *sb_bp) +{ +return NULL ; +}# define xfs_rtgroup_get_geometry (rtg, rgeo) (-EOPNOTSUPP)#endif /* CONFIG_XFS_RT */
fs/xfs/libxfs/xfs_sb.c +17 -20
@@ -1470,36 +1470,33 @@ xfs_sync_sb_buf( bool update_rtsb) {struct xfs_trans *tp; -struct xfs_buf *bp; -struct xfs_buf *rtsb_bp =NULL ;int error; error =xfs_trans_alloc (mp, &M_RES (mp)->tr_sb,0 ,0 ,0 , &tp);if (error)return error; - bp =xfs_trans_getsb (tp);xfs_log_sb (tp); -xfs_trans_bhold (tp, bp); -if (update_rtsb) { - rtsb_bp =xfs_log_rtsb (tp, bp); -if (rtsb_bp) -xfs_trans_bhold (tp, rtsb_bp); - } +if (update_rtsb) +xfs_log_rtsb (tp,xfs_trans_getsb (tp));xfs_trans_set_sync (tp); error =xfs_trans_commit (tp);if (error) - goto out; -/* -* write out the sb buffer to get the changes to disk -*/ - error =xfs_bwrite (bp); -if (!error && rtsb_bp) - error =xfs_bwrite (rtsb_bp); -out: -if (rtsb_bp) -xfs_buf_relse (rtsb_bp); -xfs_buf_relse (bp); +return error; + +/* Re-acquire and write the sb and rtsb to disk. */ +xfs_buf_lock (mp->m_sb_bp); + error =xfs_bwrite (mp->m_sb_bp); +xfs_buf_unlock (mp->m_sb_bp); +if (error) +return error; + +if (update_rtsb && mp->m_rtsb_bp) { +xfs_buf_lock (mp->m_rtsb_bp); + error =xfs_bwrite (mp->m_rtsb_bp); +xfs_buf_unlock (mp->m_rtsb_bp); + } +return error; }
Sasha Levin
maintainerPATCH 1/1 xfs: don't hold buffer locks across sync transaction commit in xfs_sync_sb_buf
From: Yun Zhou <[email protected]>
[ Upstream commit 41a28c865d1d5843f8cb9e0af17a8f4d9e2961ff ]
xfs_sync_sb_buf() holds sb/rtsb buffer locks across a synchronous xfs_trans_commit(), which flushes the CIL push workqueue internally. If shutdown occurs during the CIL push, xfs_buf_item_unpin() needs to lock these buffers to fail them, causing a deadlock:
setlabel: holds buf lock -> flush_workqueue(xfs-cil)
CIL push worker: xfs_buf_item_unpin -> xfs_buf_lock(same buf)
Remove the xfs_trans_bhold() calls so that commit releases the buffer locks normally. After the sync commit, re-acquire the buffers via mp->m_sb_bp / mp->m_rtsb_bp for the on-disk writeback.
--- fs/xfs/libxfs/xfs_sb.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-)
fs/xfs/libxfs/xfs_sb.c +7 -10
@@ -1081,26 +1081,23 @@ xfs_sync_sb_buf( struct xfs_mount *mp) {struct xfs_trans *tp; -struct xfs_buf *bp;int error; error =xfs_trans_alloc (mp, &M_RES (mp)->tr_sb,0 ,0 ,0 , &tp);if (error)return error; - bp =xfs_trans_getsb (tp);xfs_log_sb (tp); -xfs_trans_bhold (tp, bp);xfs_trans_set_sync (tp); error =xfs_trans_commit (tp);if (error) - goto out; -/* -* write out the sb buffer to get the changes to disk -*/ - error =xfs_bwrite (bp); -out: -xfs_buf_relse (bp); +return error; + +/* Re-acquire and write the sb to disk. */ +xfs_buf_lock (mp->m_sb_bp); + error =xfs_bwrite (mp->m_sb_bp); +xfs_buf_unlock (mp->m_sb_bp); +return error; }
Signature · 1 line
2.53.0