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:
parent
275c8426fb
commit
292dea86df
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user