From bbe4d31d85e2c44ff4f9c1809f2a3aa44a3519e1 Mon Sep 17 00:00:00 2001 From: Dave Chinner Date: Mon, 27 Dec 2021 19:42:53 +0800 Subject: [PATCH] xfs: remove callback dequeue loop from xlog_state_do_iclog_callbacks mainline-inclusion from mainline-v5.13-rc4 commit b6903358c230c517b29ecdb6123276d96cc0beab category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I4KIAO CVE: NA Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b6903358c230c517b29ecdb6123276d96cc0beab ------------------------------------------------- If we are processing callbacks on an iclog, nothing can be concurrently adding callbacks to the loop. We only add callbacks to the iclog when they are in ACTIVE or WANT_SYNC state, and we explicitly do not add callbacks if the iclog is already in IOERROR state. The only way to have a dequeue racing with an enqueue is to be processing a shutdown without a direct reference to an iclog in ACTIVE or WANT_SYNC state. As the enqueue avoids this race condition, we only ever need a single dequeue operation in xlog_state_do_iclog_callbacks(). Hence we can remove the loop. Signed-off-by: Dave Chinner Reviewed-by: Brian Foster Reviewed-by: Darrick J. Wong Signed-off-by: Darrick J. Wong Signed-off-by: Guo Xuenan Reviewed-by: Lihong Kou Reviewed-by: Zhang Yi Signed-off-by: Zheng Zengkai --- fs/xfs/xfs_log.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 26ace6c12e3a..a68fdae831af 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -2688,19 +2688,13 @@ xlog_state_do_iclog_callbacks( struct xlog *log, struct xlog_in_core *iclog) { - spin_lock(&iclog->ic_callback_lock); - - while (!list_empty(&iclog->ic_callbacks)) { - LIST_HEAD(tmp); - list_splice_init(&iclog->ic_callbacks, &tmp); - - spin_unlock(&iclog->ic_callback_lock); - xlog_cil_process_committed(&tmp); - spin_lock(&iclog->ic_callback_lock); - } + LIST_HEAD(tmp); + spin_lock(&iclog->ic_callback_lock); + list_splice_init(&iclog->ic_callbacks, &tmp); spin_unlock(&iclog->ic_callback_lock); + xlog_cil_process_committed(&tmp); } STATIC void -- GitLab