diff options
Diffstat (limited to 'libbcachefs/alloc_background.c')
-rw-r--r-- | libbcachefs/alloc_background.c | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c index 03391464..4f208fab 100644 --- a/libbcachefs/alloc_background.c +++ b/libbcachefs/alloc_background.c @@ -446,6 +446,13 @@ int bch2_alloc_read(struct bch_fs *c) for_each_btree_key(&trans, iter, BTREE_ID_alloc, POS_MIN, BTREE_ITER_PREFETCH, k, ret) { + /* + * Not a fsck error because this is checked/repaired by + * bch2_check_alloc_key() which runs later: + */ + if (!bch2_dev_bucket_exists(c, k.k->p)) + continue; + ca = bch_dev_bkey_exists(c, k.k->p.inode); bch2_alloc_to_v4(k, &a); @@ -614,7 +621,8 @@ static int bch2_check_alloc_key(struct btree_trans *trans, return ret; if (fsck_err_on(!bch2_dev_bucket_exists(c, alloc_k.k->p), c, - "alloc key for invalid device or bucket")) + "alloc key for invalid device:bucket %llu:%llu", + alloc_k.k->p.inode, alloc_k.k->p.offset)) return bch2_btree_delete_at(trans, alloc_iter, 0); ca = bch_dev_bkey_exists(c, alloc_k.k->p.inode); @@ -706,7 +714,6 @@ static int bch2_check_discard_freespace_key(struct btree_trans *trans, struct bch_alloc_v4 a; u64 genbits; struct bpos pos; - struct bkey_i *update; enum bch_data_type state = iter->btree_id == BTREE_ID_need_discard ? BCH_DATA_need_discard : BCH_DATA_free; @@ -728,9 +735,8 @@ static int bch2_check_discard_freespace_key(struct btree_trans *trans, bch2_trans_iter_init(trans, &alloc_iter, BTREE_ID_alloc, pos, 0); if (fsck_err_on(!bch2_dev_bucket_exists(c, pos), c, - "%llu:%llu set in %s btree but device or bucket does not exist", - pos.inode, pos.offset, - bch2_btree_ids[iter->btree_id])) + "entry in %s btree for nonexistant dev:bucket %llu:%llu", + bch2_btree_ids[iter->btree_id], pos.inode, pos.offset)) goto delete; k = bch2_btree_iter_peek_slot(&alloc_iter); @@ -756,21 +762,8 @@ fsck_err: printbuf_exit(&buf); return ret; delete: - if (iter->btree_id == BTREE_ID_freespace) { - /* should probably add a helper for deleting extents */ - update = bch2_trans_kmalloc(trans, sizeof(*update)); - ret = PTR_ERR_OR_ZERO(update); - if (ret) - goto err; - - bkey_init(&update->k); - update->k.p = iter->pos; - bch2_key_resize(&update->k, 1); - - ret = bch2_trans_update(trans, iter, update, 0); - } else { - ret = bch2_btree_delete_at(trans, iter, 0); - } + ret = bch2_btree_delete_extent_at(trans, iter, + iter->btree_id == BTREE_ID_freespace ? 1 : 0, 0); goto out; } |