Skip to content

Commit 83d539b

Browse files
author
Kent Overstreet
committed
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 <kent.overstreet@linux.dev>
1 parent 570f505 commit 83d539b

File tree

1 file changed

+0
-3
lines changed

1 file changed

+0
-3
lines changed

fs/bcachefs/snapshot.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -843,9 +843,6 @@ static int check_snapshot_exists(struct btree_trans *trans, u32 id)
843843
{
844844
struct bch_fs *c = trans->c;
845845

846-
if (bch2_snapshot_exists(c, id))
847-
return 0;
848-
849846
/* Do we need to reconstruct the snapshot_tree entry as well? */
850847
struct btree_iter iter;
851848
struct bkey_s_c k;

0 commit comments

Comments
 (0)