summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-01-03 23:39:42 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-01-06 19:48:03 -0500
commitcb328c6316d0901864dadec7c38cebb65d847720 (patch)
treeaf5008e988b5778052c95482f0ceb72ab0d6fbad
parent8e96fc6c08557873dbce4225b7f389d997a19a08 (diff)
bcachefs: Fix move_ctxt_wait_event()
We shouldn't be evaluating cond again if it already returned true. This fixes a bug when this helper is used for taking nocow locks. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/move.h20
1 files changed, 12 insertions, 8 deletions
diff --git a/fs/bcachefs/move.h b/fs/bcachefs/move.h
index a2822d4a4afb..34b9cadef6b5 100644
--- a/fs/bcachefs/move.h
+++ b/fs/bcachefs/move.h
@@ -28,14 +28,18 @@ struct moving_context {
wait_queue_head_t wait;
};
-#define move_ctxt_wait_event(_ctxt, _trans, _cond) \
-do { \
- bch2_moving_ctxt_do_pending_writes(_ctxt, _trans); \
- \
- if (_cond) \
- break; \
- __wait_event((_ctxt)->wait, \
- bch2_moving_ctxt_next_pending_write(_ctxt) || (_cond));\
+#define move_ctxt_wait_event(_ctxt, _trans, _cond) \
+do { \
+ bool cond_finished = false; \
+ bch2_moving_ctxt_do_pending_writes(_ctxt, _trans); \
+ \
+ if (_cond) \
+ break; \
+ __wait_event((_ctxt)->wait, \
+ bch2_moving_ctxt_next_pending_write(_ctxt) || \
+ (cond_finished = (_cond))); \
+ if (cond_finished) \
+ break; \
} while (1)
typedef bool (*move_pred_fn)(struct bch_fs *, void *, struct bkey_s_c,