aboutsummaryrefslogtreecommitdiffstats
path: root/rust/helpers/workqueue.c
diff options
context:
space:
mode:
authorKent Overstreet <[email protected]>2025-04-02 18:31:12 +0000
committerKent Overstreet <[email protected]>2025-04-03 16:11:43 +0000
commit83d539b1b04705f972b53b4669fb587c54def0db (patch)
tree83f094b56b01848cedb0114cfe5ed0619357fed1 /rust/helpers/workqueue.c
parentbcachefs: use nonblocking variant of print_string_as_lines in error path (diff)
downloadkernel-83d539b1b04705f972b53b4669fb587c54def0db.tar.gz
kernel-83d539b1b04705f972b53b4669fb587c54def0db.zip
bcachefs: Fix check_snapshot_exists() restart handling
Codepaths that create entries in the snapshots btree currently call bch2_mark_snapshot(), which updates the in-memory snapshot table, before transaction commit. This is because bch2_mark_snapshot() is an atomic trigger, run with btree write locks held, and isn't allowed to fail - but it might need to reallocate the table, hence we call it early when we're still allowed to fail. This is generally harmless - if we fail, we'll have left an entry in the snapshots table around, but nothing will reference it and it'll get overwritten if reused by another transaction. But check_snapshot_exists(), which reconstructs snapshots when the snapshots btree has been corrupted or lost, was erronously rechecking if the snapshot exists inside the transaction commit loop - so on transaction restart (in this case mem_realloced), the second iteration would return without repairing. This code needs some cleanup: splitting out a "maybe realloc snapshots table" helper would have avoided this, that will be in the next patch. Signed-off-by: Kent Overstreet <[email protected]>
Diffstat (limited to 'rust/helpers/workqueue.c')
0 files changed, 0 insertions, 0 deletions