diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2017-03-19 15:56:34 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-03-19 17:31:47 -0800 |
commit | 5ec39af8eaba49aee7bafa44c661da39e2f40dc3 (patch) | |
tree | 1fb1a981602cbf22c7d2b2dba1168c715d7cecb5 /libbcachefs/alloc.h | |
parent | bb1941de5378a7b8122d3575dcbc7d0aeb6326f0 (diff) |
Rename from bcache-tools to bcachefs-tools
Diffstat (limited to 'libbcachefs/alloc.h')
-rw-r--r-- | libbcachefs/alloc.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/libbcachefs/alloc.h b/libbcachefs/alloc.h new file mode 100644 index 00000000..08638b25 --- /dev/null +++ b/libbcachefs/alloc.h @@ -0,0 +1,85 @@ +#ifndef _BCACHE_ALLOC_H +#define _BCACHE_ALLOC_H + +#include "alloc_types.h" + +struct bkey; +struct bucket; +struct bch_dev; +struct bch_fs; +struct dev_group; + +static inline size_t prios_per_bucket(const struct bch_dev *ca) +{ + return (bucket_bytes(ca) - sizeof(struct prio_set)) / + sizeof(struct bucket_disk); +} + +static inline size_t prio_buckets(const struct bch_dev *ca) +{ + return DIV_ROUND_UP((size_t) (ca)->mi.nbuckets, prios_per_bucket(ca)); +} + +void bch2_dev_group_remove(struct dev_group *, struct bch_dev *); +void bch2_dev_group_add(struct dev_group *, struct bch_dev *); + +int bch2_prio_read(struct bch_dev *); + +size_t bch2_bucket_alloc(struct bch_dev *, enum alloc_reserve); + +void bch2_open_bucket_put(struct bch_fs *, struct open_bucket *); + +struct open_bucket *bch2_alloc_sectors_start(struct bch_fs *, + struct write_point *, + unsigned, unsigned, + enum alloc_reserve, + struct closure *); + +void bch2_alloc_sectors_append_ptrs(struct bch_fs *, struct bkey_i_extent *, + unsigned, struct open_bucket *, unsigned); +void bch2_alloc_sectors_done(struct bch_fs *, struct write_point *, + struct open_bucket *); + +struct open_bucket *bch2_alloc_sectors(struct bch_fs *, struct write_point *, + struct bkey_i_extent *, unsigned, unsigned, + enum alloc_reserve, struct closure *); + +static inline void bch2_wake_allocator(struct bch_dev *ca) +{ + struct task_struct *p; + + rcu_read_lock(); + if ((p = ACCESS_ONCE(ca->alloc_thread))) + wake_up_process(p); + rcu_read_unlock(); +} + +static inline struct bch_dev *dev_group_next(struct dev_group *devs, + unsigned *iter) +{ + struct bch_dev *ret = NULL; + + while (*iter < devs->nr && + !(ret = rcu_dereference_check(devs->d[*iter].dev, + lockdep_is_held(&devs->lock)))) + (*iter)++; + + return ret; +} + +#define group_for_each_dev(ca, devs, iter) \ + for ((iter) = 0; \ + ((ca) = dev_group_next((devs), &(iter))); \ + (iter)++) + +#define open_bucket_for_each_ptr(_ob, _ptr) \ + for ((_ptr) = (_ob)->ptrs; \ + (_ptr) < (_ob)->ptrs + (_ob)->nr_ptrs; \ + (_ptr)++) + +void bch2_recalc_capacity(struct bch_fs *); +void bch2_dev_allocator_stop(struct bch_dev *); +int bch2_dev_allocator_start(struct bch_dev *); +void bch2_fs_allocator_init(struct bch_fs *); + +#endif /* _BCACHE_ALLOC_H */ |