diff options
-rw-r--r-- | fs/bcachefs/alloc.c | 46 | ||||
-rw-r--r-- | fs/bcachefs/alloc.h | 1 |
2 files changed, 25 insertions, 22 deletions
diff --git a/fs/bcachefs/alloc.c b/fs/bcachefs/alloc.c index f6592de9b931..c195ffbdf3b3 100644 --- a/fs/bcachefs/alloc.c +++ b/fs/bcachefs/alloc.c @@ -400,26 +400,36 @@ int bch2_alloc_replay_key(struct bch_fs *c, struct bpos pos) return ret; } -static int bch2_alloc_write(struct bch_fs *c, struct bch_dev *ca) +int bch2_alloc_write(struct bch_fs *c) { - struct btree_iter iter; - unsigned long bucket; + struct bch_dev *ca; + unsigned i; int ret = 0; - bch2_btree_iter_init(&iter, c, BTREE_ID_ALLOC, POS_MIN, - BTREE_ITER_SLOTS|BTREE_ITER_INTENT); + for_each_rw_member(ca, c, i) { + struct btree_iter iter; + unsigned long bucket; - down_read(&ca->bucket_lock); - for_each_set_bit(bucket, ca->buckets_dirty, ca->mi.nbuckets) { - ret = __bch2_alloc_write_key(c, ca, bucket, &iter, NULL); - if (ret) - break; + bch2_btree_iter_init(&iter, c, BTREE_ID_ALLOC, POS_MIN, + BTREE_ITER_SLOTS|BTREE_ITER_INTENT); + + down_read(&ca->bucket_lock); + for_each_set_bit(bucket, ca->buckets_dirty, ca->mi.nbuckets) { + ret = __bch2_alloc_write_key(c, ca, bucket, &iter, NULL); + if (ret) + break; + + clear_bit(bucket, ca->buckets_dirty); + } + up_read(&ca->bucket_lock); + bch2_btree_iter_unlock(&iter); - clear_bit(bucket, ca->buckets_dirty); + if (ret) { + percpu_ref_put(&ca->io_ref); + break; + } } - up_read(&ca->bucket_lock); - bch2_btree_iter_unlock(&iter); return ret; } @@ -2037,15 +2047,7 @@ int bch2_fs_allocator_start(struct bch_fs *c) } } - for_each_rw_member(ca, c, i) { - ret = bch2_alloc_write(c, ca); - if (ret) { - percpu_ref_put(&ca->io_ref); - return ret; - } - } - - return 0; + return bch2_alloc_write(c); } void bch2_fs_allocator_init(struct bch_fs *c) diff --git a/fs/bcachefs/alloc.h b/fs/bcachefs/alloc.h index 3bd765b675cc..3bdc294691de 100644 --- a/fs/bcachefs/alloc.h +++ b/fs/bcachefs/alloc.h @@ -118,6 +118,7 @@ static inline void writepoint_init(struct write_point *wp, wp->type = type; } +int bch2_alloc_write(struct bch_fs *); int bch2_fs_allocator_start(struct bch_fs *); void bch2_fs_allocator_init(struct bch_fs *); |