mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
bcachefs: Fix a KMSAN splat in btree_update_nodes_written()
We may sometimes read from uninitialized memory; we know, and that's ok. We check if a btree node has been reused before waiting on any outstanding IO. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
28aa859b6b
commit
1f88c35674
1 changed files with 9 additions and 9 deletions
|
@ -649,6 +649,14 @@ static int btree_update_nodes_written_trans(struct btree_trans *trans,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If the node has been reused, we might be reading uninitialized memory - that's fine: */
|
||||||
|
static noinline __no_kmsan_checks bool btree_node_seq_matches(struct btree *b, __le64 seq)
|
||||||
|
{
|
||||||
|
struct btree_node *b_data = READ_ONCE(b->data);
|
||||||
|
|
||||||
|
return (b_data ? b_data->keys.seq : 0) == seq;
|
||||||
|
}
|
||||||
|
|
||||||
static void btree_update_nodes_written(struct btree_update *as)
|
static void btree_update_nodes_written(struct btree_update *as)
|
||||||
{
|
{
|
||||||
struct bch_fs *c = as->c;
|
struct bch_fs *c = as->c;
|
||||||
|
@ -677,17 +685,9 @@ static void btree_update_nodes_written(struct btree_update *as)
|
||||||
* on disk:
|
* on disk:
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < as->nr_old_nodes; i++) {
|
for (i = 0; i < as->nr_old_nodes; i++) {
|
||||||
__le64 seq;
|
|
||||||
|
|
||||||
b = as->old_nodes[i];
|
b = as->old_nodes[i];
|
||||||
|
|
||||||
bch2_trans_begin(trans);
|
if (btree_node_seq_matches(b, as->old_nodes_seq[i]))
|
||||||
btree_node_lock_nopath_nofail(trans, &b->c, SIX_LOCK_read);
|
|
||||||
seq = b->data ? b->data->keys.seq : 0;
|
|
||||||
six_unlock_read(&b->c.lock);
|
|
||||||
bch2_trans_unlock_long(trans);
|
|
||||||
|
|
||||||
if (seq == as->old_nodes_seq[i])
|
|
||||||
wait_on_bit_io(&b->flags, BTREE_NODE_write_in_flight_inner,
|
wait_on_bit_io(&b->flags, BTREE_NODE_write_in_flight_inner,
|
||||||
TASK_UNINTERRUPTIBLE);
|
TASK_UNINTERRUPTIBLE);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue