summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.bcachefs_revision2
-rw-r--r--libbcachefs/bkey.h5
-rw-r--r--libbcachefs/btree_iter.c7
-rw-r--r--libbcachefs/extents.c4
-rw-r--r--libbcachefs/movinggc.c3
5 files changed, 12 insertions, 9 deletions
diff --git a/.bcachefs_revision b/.bcachefs_revision
index 713b4346..6620636b 100644
--- a/.bcachefs_revision
+++ b/.bcachefs_revision
@@ -1 +1 @@
-f38382c5747090ac9160e6d5fa1386954cb1f23c
+7e42539c80470cb655bbc46cd0f144de6c644523
diff --git a/libbcachefs/bkey.h b/libbcachefs/bkey.h
index b52628be..280c9ec4 100644
--- a/libbcachefs/bkey.h
+++ b/libbcachefs/bkey.h
@@ -32,10 +32,7 @@ struct bkey_s {
#define bkey_next(_k) vstruct_next(_k)
-static inline unsigned bkey_val_u64s(const struct bkey *k)
-{
- return k->u64s - BKEY_U64s;
-}
+#define bkey_val_u64s(_k) ((_k)->u64s - BKEY_U64s)
static inline size_t bkey_val_bytes(const struct bkey *k)
{
diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c
index e78c6cad..9c37de75 100644
--- a/libbcachefs/btree_iter.c
+++ b/libbcachefs/btree_iter.c
@@ -958,9 +958,10 @@ static void btree_iter_up(struct btree_iter *iter)
int __must_check __bch2_btree_iter_traverse(struct btree_iter *);
static int __btree_iter_traverse_all(struct btree_trans *trans,
- struct btree_iter *iter, int ret)
+ struct btree_iter *orig_iter, int ret)
{
struct bch_fs *c = trans->c;
+ struct btree_iter *iter;
u8 sorted[BTREE_ITER_MAX];
unsigned i, nr_sorted = 0;
@@ -989,8 +990,8 @@ retry_all:
if (unlikely(ret == -EIO)) {
trans->error = true;
- iter->flags |= BTREE_ITER_ERROR;
- iter->l[iter->level].b = BTREE_ITER_NO_NODE_ERROR;
+ orig_iter->flags |= BTREE_ITER_ERROR;
+ orig_iter->l[orig_iter->level].b = BTREE_ITER_NO_NODE_ERROR;
goto out;
}
diff --git a/libbcachefs/extents.c b/libbcachefs/extents.c
index dffcc144..818c772a 100644
--- a/libbcachefs/extents.c
+++ b/libbcachefs/extents.c
@@ -1651,6 +1651,10 @@ static bool bch2_extent_merge_inline(struct bch_fs *c,
EBUG_ON(bkey_written(b, m));
+ if (bkey_val_u64s(l) > BKEY_EXTENT_VAL_U64s_MAX ||
+ bkey_val_u64s(r) > BKEY_EXTENT_VAL_U64s_MAX)
+ return BCH_MERGE_NOMERGE;
+
/*
* We need to save copies of both l and r, because we might get a
* partial merge (which modifies both) and then fails to repack
diff --git a/libbcachefs/movinggc.c b/libbcachefs/movinggc.c
index c6a4f5b9..fe66efb4 100644
--- a/libbcachefs/movinggc.c
+++ b/libbcachefs/movinggc.c
@@ -282,7 +282,8 @@ int bch2_copygc_start(struct bch_fs *c, struct bch_dev *ca)
{
struct task_struct *t;
- BUG_ON(ca->copygc_thread);
+ if (ca->copygc_thread)
+ return 0;
if (c->opts.nochanges)
return 0;