summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-04-06 14:42:00 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2022-04-06 14:42:00 -0400
commit30306c5aa6b99df31575cdf1e523d5e774636245 (patch)
treeb8c6e74aa6abf7c7ccea1c9573f915d4573bf2a1
parent790ca9522a96efe321aae36fb0d7f4e437110b0f (diff)
Update bcachefs sources to 07bac0c685 bcachefs: fsck: Work around transaction restarts
-rw-r--r--.bcachefs_revision2
-rw-r--r--libbcachefs/fsck.c18
2 files changed, 17 insertions, 3 deletions
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;