diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-02-07 06:15:59 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-02-07 06:15:59 -0500 |
commit | 496cbe9474173ec41bf221dc8ab1f5d70a128c3b (patch) | |
tree | 668634dd9339b27bf81b157ee52d8464f411a4e4 | |
parent | 67109c13b64a806473f6fb126d3ea99c3a79592c (diff) |
bcachefs: export bch2_alloc_write()
needed for migration tool
-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 *); |