33 lines
999 B
Diff
33 lines
999 B
Diff
From 817d1b67b6da0a1e2ac94c73ac12fcdb10be1d1e Mon Sep 17 00:00:00 2001
|
|
From: "Darrick J. Wong" <djwong@kernel.org>
|
|
Date: Wed, 20 Dec 2023 08:53:46 -0800
|
|
Subject: xfs_scrub: handle spurious wakeups in scan_fs_tree
|
|
|
|
Coverity reminded me that the pthread_cond_wait can wake up and return
|
|
without the predicate variable (sft.nr_dirs > 0) actually changing.
|
|
Therefore, one has to retest the condition after each wakeup.
|
|
|
|
Coverity-id: 1554280
|
|
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
|
|
Reviewed-by: Christoph Hellwig <hch@lst.de>
|
|
---
|
|
scrub/vfs.c | 2 +-
|
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
|
|
diff --git a/scrub/vfs.c b/scrub/vfs.c
|
|
index 577eb6dc3e..3c1825a75e 100644
|
|
--- a/scrub/vfs.c
|
|
+++ b/scrub/vfs.c
|
|
@@ -263,7 +263,7 @@ scan_fs_tree(
|
|
* about to tear everything down.
|
|
*/
|
|
pthread_mutex_lock(&sft.lock);
|
|
- if (sft.nr_dirs)
|
|
+ while (sft.nr_dirs > 0)
|
|
pthread_cond_wait(&sft.wakeup, &sft.lock);
|
|
assert(sft.nr_dirs == 0);
|
|
pthread_mutex_unlock(&sft.lock);
|
|
--
|
|
cgit 1.2.3-korg
|
|
|