summaryrefslogtreecommitdiff
path: root/libbcachefs/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/alloc.c')
-rw-r--r--libbcachefs/alloc.c46
1 files changed, 24 insertions, 22 deletions
diff --git a/libbcachefs/alloc.c b/libbcachefs/alloc.c
index f6592de9..c195ffbd 100644
--- a/libbcachefs/alloc.c
+++ b/libbcachefs/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)