diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-06-10 19:39:00 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2022-10-03 22:52:23 -0400 |
commit | c05cd176fb1522b4ca75fb21c37ea4fd838ba3ed (patch) | |
tree | c3a957932a3dbe29ac5a57f4719cea620ca287c5 | |
parent | d361365b66e95265db0861ea2d54b2fc6199dd54 (diff) |
bcachefs: Fix freespace initialization
bch2_dev_freespace_init() was using __bch2_trans_do() incorrectly, and
calling bch2_bucket_do_index() with a stale alloc key.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/alloc_background.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c index 0bbc9d271404..2faff2f9bfd3 100644 --- a/fs/bcachefs/alloc_background.c +++ b/fs/bcachefs/alloc_background.c @@ -1190,12 +1190,26 @@ void bch2_do_invalidates(struct bch_fs *c) queue_work(system_long_wq, &c->invalidate_work); } +static int bucket_freespace_init(struct btree_trans *trans, struct btree_iter *iter) +{ + struct bch_alloc_v4 a; + struct bkey_s_c k; + int ret; + + k = bch2_btree_iter_peek_slot(iter); + ret = bkey_err(k); + if (ret) + return ret; + + bch2_alloc_to_v4(k, &a); + return bch2_bucket_do_index(trans, k, &a, true); +} + static int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca) { struct btree_trans trans; struct btree_iter iter; struct bkey_s_c k; - struct bch_alloc_v4 a; struct bch_member *m; int ret; @@ -1208,10 +1222,9 @@ static int bch2_dev_freespace_init(struct bch_fs *c, struct bch_dev *ca) if (iter.pos.offset >= ca->mi.nbuckets) break; - bch2_alloc_to_v4(k, &a); ret = __bch2_trans_do(&trans, NULL, NULL, BTREE_INSERT_LAZY_RW, - bch2_bucket_do_index(&trans, k, &a, true)); + bucket_freespace_init(&trans, &iter)); if (ret) break; } |