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;