Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bcachefs: Don't corrupt journal keys gap buffer when dropping alloc info

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>

+9 -2
+1 -1
fs/bcachefs/btree_io.c
··· 1338 1338 if (saw_error && !btree_node_read_error(b)) { 1339 1339 printbuf_reset(&buf); 1340 1340 bch2_bpos_to_text(&buf, b->key.k.p); 1341 - bch_info(c, "%s: rewriting btree node at btree=%s level=%u %s due to error", 1341 + bch_err_ratelimited(c, "%s: rewriting btree node at btree=%s level=%u %s due to error", 1342 1342 __func__, bch2_btree_id_str(b->c.btree_id), b->c.level, buf.buf); 1343 1343 1344 1344 bch2_btree_node_rewrite_async(c, b);
+5 -1
fs/bcachefs/recovery.c
··· 90 90 struct journal_keys *keys = &c->journal_keys; 91 91 size_t src, dst; 92 92 93 + move_gap(keys, keys->nr); 94 + 93 95 for (src = 0, dst = 0; src < keys->nr; src++) 94 96 if (!btree_id_is_alloc(keys->data[src].btree_id)) 95 97 keys->data[dst++] = keys->data[src]; 96 - keys->nr = dst; 98 + keys->nr = keys->gap = dst; 97 99 } 98 100 99 101 /* ··· 204 202 } 205 203 206 204 BUG_ON(!atomic_read(&keys->ref)); 205 + 206 + move_gap(keys, keys->nr); 207 207 208 208 /* 209 209 * First, attempt to replay keys in sorted order. This is more
+3
fs/bcachefs/util.h
··· 683 683 /* Move the gap in a gap buffer: */ 684 684 #define move_gap(_d, _new_gap) \ 685 685 do { \ 686 + BUG_ON(_new_gap > (_d)->nr); \ 687 + BUG_ON((_d)->gap > (_d)->nr); \ 688 + \ 686 689 __move_gap((_d)->data, sizeof((_d)->data[0]), \ 687 690 (_d)->nr, (_d)->size, (_d)->gap, _new_gap); \ 688 691 (_d)->gap = _new_gap; \