Skip to content

Commit a586036

Browse files
author
Kent Overstreet
committed
bcachefs: Don't corrupt journal keys gap buffer when dropping alloc info
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
1 parent f3589bf commit a586036

File tree

3 files changed

+9
-2
lines changed

3 files changed

+9
-2
lines changed

fs/bcachefs/btree_io.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1338,7 +1338,7 @@ static void btree_node_read_work(struct work_struct *work)
13381338
if (saw_error && !btree_node_read_error(b)) {
13391339
printbuf_reset(&buf);
13401340
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",
13421342
__func__, bch2_btree_id_str(b->c.btree_id), b->c.level, buf.buf);
13431343

13441344
bch2_btree_node_rewrite_async(c, b);

fs/bcachefs/recovery.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,12 @@ static void do_reconstruct_alloc(struct bch_fs *c)
9090
struct journal_keys *keys = &c->journal_keys;
9191
size_t src, dst;
9292

93+
move_gap(keys, keys->nr);
94+
9395
for (src = 0, dst = 0; src < keys->nr; src++)
9496
if (!btree_id_is_alloc(keys->data[src].btree_id))
9597
keys->data[dst++] = keys->data[src];
96-
keys->nr = dst;
98+
keys->nr = keys->gap = dst;
9799
}
98100

99101
/*
@@ -203,6 +205,8 @@ static int bch2_journal_replay(struct bch_fs *c)
203205

204206
BUG_ON(!atomic_read(&keys->ref));
205207

208+
move_gap(keys, keys->nr);
209+
206210
/*
207211
* First, attempt to replay keys in sorted order. This is more
208212
* efficient - better locality of btree access - but some might fail if

fs/bcachefs/util.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,9 @@ static inline void __move_gap(void *array, size_t element_size,
683683
/* Move the gap in a gap buffer: */
684684
#define move_gap(_d, _new_gap) \
685685
do { \
686+
BUG_ON(_new_gap > (_d)->nr); \
687+
BUG_ON((_d)->gap > (_d)->nr); \
688+
\
686689
__move_gap((_d)->data, sizeof((_d)->data[0]), \
687690
(_d)->nr, (_d)->size, (_d)->gap, _new_gap); \
688691
(_d)->gap = _new_gap; \

0 commit comments

Comments
 (0)