diff --git a/.bcachefs_revision b/.bcachefs_revision index 3cdd136f..70862777 100644 --- a/.bcachefs_revision +++ b/.bcachefs_revision @@ -1 +1 @@ -e027cf9aa0e18b688d76cd6c2702491b8d06f48f +07bac0c685f553f66938053e9aa725dc8df0e3ee diff --git a/libbcachefs/fsck.c b/libbcachefs/fsck.c index 2582ddf1..d2b155f0 100644 --- a/libbcachefs/fsck.c +++ b/libbcachefs/fsck.c @@ -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;