summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-02-07 06:15:59 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2018-02-07 06:15:59 -0500
commit496cbe9474173ec41bf221dc8ab1f5d70a128c3b (patch)
tree668634dd9339b27bf81b157ee52d8464f411a4e4
parent67109c13b64a806473f6fb126d3ea99c3a79592c (diff)
bcachefs: export bch2_alloc_write()
needed for migration tool
-rw-r--r--fs/bcachefs/alloc.c46
-rw-r--r--fs/bcachefs/alloc.h1
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 *);