bcachefs: fsck: Work around transaction restarts

In check_extents() and check_dirents(), we're working towards only
handling transaction restarts in one place, at the top level - but we're
not there yet. check_i_sectors() and check_subdir_count() handle
transaction restarts locally, which means the iterator for the
dirent/extent is left unlocked (should_be_locked == 0), leading to
asserts popping when we go to do updates.

This patch hacks around this for now, until we can delete the offending
code.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
This commit is contained in:
Kent Overstreet 2022-04-06 14:35:10 -04:00 committed by Kent Overstreet
parent 275c8426fb
commit 292dea86df

View File

@ -1146,7 +1146,7 @@ static int check_extent(struct btree_trans *trans, struct btree_iter *iter,
struct inode_walker_entry *i;
struct printbuf buf = PRINTBUF;
int ret = 0;
peek:
k = bch2_btree_iter_peek(iter);
if (!k.k)
goto out;
@ -1173,6 +1173,15 @@ static int check_extent(struct btree_trans *trans, struct btree_iter *iter,
if (ret)
goto err;
}
if (!iter->path->should_be_locked) {
/*
* hack: check_i_sectors may have handled a transaction restart,
* it shouldn't be but we need to fix the new i_sectors check
* code and delete the old bch2_count_inode_sectors() first
*/
goto peek;
}
#if 0
if (bkey_cmp(prev.k->k.p, bkey_start_pos(k.k)) > 0) {
char buf1[200];
@ -1464,7 +1473,7 @@ static int check_dirent(struct btree_trans *trans, struct btree_iter *iter,
struct inode_walker_entry *i;
struct printbuf buf = PRINTBUF;
int ret = 0;
peek:
k = bch2_btree_iter_peek(iter);
if (!k.k)
goto out;
@ -1492,6 +1501,11 @@ static int check_dirent(struct btree_trans *trans, struct btree_iter *iter,
goto err;
}
if (!iter->path->should_be_locked) {
/* hack: see check_extent() */
goto peek;
}
ret = __walk_inode(trans, dir, k.k->p);
if (ret < 0)
goto err;