[PATCH 6/7] btrfs: check for exit condition after waking in wait_log_commit()
[email protected] Wed, 22 Jul 2026 13:41:42 +0100
| Newsgroups | org.kernel.vger.linux-btrfs |
|---|---|
| Message-ID | <c629e07efa3749bef9fdf9a3821947386b6e53a6.1784656641.git.fdmanana@suse.com> |
From: Filipe Manana <[email protected]> We check for the exit condition after we add ourselves to the wait queue and before we unlock the root's log_mutex, sleep and lock again log_mutex. This is not incorrect, but it's not optimal since in the first iteration this is pointless because we already know that root->log_commit[index] is not zero, so we should check the exit condition only after unlocking log_mutex, sleeping, waking up and locking again the log_mutex. So move the check for the exit condition to bottom of the loop, after we were woken and locked log_mutex again. Signed-off-by: Filipe Manana <[email protected]> --- fs/btrfs/tree-log.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index f33392da78ef..f2d0f6fb3eae 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -3182,13 +3182,13 @@ static bool wait_log_commit(struct btrfs_root *root, int transid) prepare_to_wait(&root->log_commit_wait[index], &wait, TASK_UNINTERRUPTIBLE); - if (!(root->log_transid_committed < transid && - atomic_read(&root->log_commit[index]))) - break; - mutex_unlock(&root->log_mutex); schedule(); mutex_lock(&root->log_mutex); + + if (!(root->log_transid_committed < transid && + atomic_read(&root->log_commit[index]) != 0)) + break; } finish_wait(&root->log_commit_wait[index], &wait); -- 2.47.2