mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2025-11-19 07:02:46 +00:00
bcachefs: Plumb alloc_reserve through stripe create path
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
910659763e
commit
a1fb08f5df
@ -794,6 +794,7 @@ static int bucket_alloc_from_stripe(struct btree_trans *trans,
|
|||||||
unsigned nr_replicas,
|
unsigned nr_replicas,
|
||||||
unsigned *nr_effective,
|
unsigned *nr_effective,
|
||||||
bool *have_cache,
|
bool *have_cache,
|
||||||
|
enum alloc_reserve reserve,
|
||||||
unsigned flags,
|
unsigned flags,
|
||||||
struct closure *cl)
|
struct closure *cl)
|
||||||
{
|
{
|
||||||
@ -813,9 +814,7 @@ static int bucket_alloc_from_stripe(struct btree_trans *trans,
|
|||||||
if (ec_open_bucket(c, ptrs))
|
if (ec_open_bucket(c, ptrs))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
h = bch2_ec_stripe_head_get(trans, target, 0, nr_replicas - 1,
|
h = bch2_ec_stripe_head_get(trans, target, 0, nr_replicas - 1, reserve, cl);
|
||||||
wp == &c->copygc_write_point,
|
|
||||||
cl);
|
|
||||||
if (IS_ERR(h))
|
if (IS_ERR(h))
|
||||||
return PTR_ERR(h);
|
return PTR_ERR(h);
|
||||||
if (!h)
|
if (!h)
|
||||||
@ -926,7 +925,7 @@ static int open_bucket_add_buckets(struct btree_trans *trans,
|
|||||||
ret = bucket_alloc_from_stripe(trans, ptrs, wp, &devs,
|
ret = bucket_alloc_from_stripe(trans, ptrs, wp, &devs,
|
||||||
target, erasure_code,
|
target, erasure_code,
|
||||||
nr_replicas, nr_effective,
|
nr_replicas, nr_effective,
|
||||||
have_cache, flags, _cl);
|
have_cache, reserve, flags, _cl);
|
||||||
if (bch2_err_matches(ret, BCH_ERR_transaction_restart) ||
|
if (bch2_err_matches(ret, BCH_ERR_transaction_restart) ||
|
||||||
bch2_err_matches(ret, BCH_ERR_freelist_empty) ||
|
bch2_err_matches(ret, BCH_ERR_freelist_empty) ||
|
||||||
bch2_err_matches(ret, BCH_ERR_open_buckets_empty))
|
bch2_err_matches(ret, BCH_ERR_open_buckets_empty))
|
||||||
|
|||||||
@ -1336,7 +1336,7 @@ static int ec_new_stripe_alloc(struct bch_fs *c, struct ec_stripe_head *h)
|
|||||||
static struct ec_stripe_head *
|
static struct ec_stripe_head *
|
||||||
ec_new_stripe_head_alloc(struct bch_fs *c, unsigned target,
|
ec_new_stripe_head_alloc(struct bch_fs *c, unsigned target,
|
||||||
unsigned algo, unsigned redundancy,
|
unsigned algo, unsigned redundancy,
|
||||||
bool copygc)
|
enum alloc_reserve reserve)
|
||||||
{
|
{
|
||||||
struct ec_stripe_head *h;
|
struct ec_stripe_head *h;
|
||||||
struct bch_dev *ca;
|
struct bch_dev *ca;
|
||||||
@ -1352,7 +1352,7 @@ ec_new_stripe_head_alloc(struct bch_fs *c, unsigned target,
|
|||||||
h->target = target;
|
h->target = target;
|
||||||
h->algo = algo;
|
h->algo = algo;
|
||||||
h->redundancy = redundancy;
|
h->redundancy = redundancy;
|
||||||
h->copygc = copygc;
|
h->reserve = reserve;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
h->devs = target_rw_devs(c, BCH_DATA_user, target);
|
h->devs = target_rw_devs(c, BCH_DATA_user, target);
|
||||||
@ -1387,7 +1387,7 @@ struct ec_stripe_head *__bch2_ec_stripe_head_get(struct btree_trans *trans,
|
|||||||
unsigned target,
|
unsigned target,
|
||||||
unsigned algo,
|
unsigned algo,
|
||||||
unsigned redundancy,
|
unsigned redundancy,
|
||||||
bool copygc)
|
enum alloc_reserve reserve)
|
||||||
{
|
{
|
||||||
struct bch_fs *c = trans->c;
|
struct bch_fs *c = trans->c;
|
||||||
struct ec_stripe_head *h;
|
struct ec_stripe_head *h;
|
||||||
@ -1404,21 +1404,21 @@ struct ec_stripe_head *__bch2_ec_stripe_head_get(struct btree_trans *trans,
|
|||||||
if (h->target == target &&
|
if (h->target == target &&
|
||||||
h->algo == algo &&
|
h->algo == algo &&
|
||||||
h->redundancy == redundancy &&
|
h->redundancy == redundancy &&
|
||||||
h->copygc == copygc) {
|
h->reserve == reserve) {
|
||||||
ret = bch2_trans_mutex_lock(trans, &h->lock);
|
ret = bch2_trans_mutex_lock(trans, &h->lock);
|
||||||
if (ret)
|
if (ret)
|
||||||
h = ERR_PTR(ret);
|
h = ERR_PTR(ret);
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
|
|
||||||
h = ec_new_stripe_head_alloc(c, target, algo, redundancy, copygc);
|
h = ec_new_stripe_head_alloc(c, target, algo, redundancy, reserve);
|
||||||
found:
|
found:
|
||||||
mutex_unlock(&c->ec_stripe_head_lock);
|
mutex_unlock(&c->ec_stripe_head_lock);
|
||||||
return h;
|
return h;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int new_stripe_alloc_buckets(struct btree_trans *trans, struct ec_stripe_head *h,
|
static int new_stripe_alloc_buckets(struct btree_trans *trans, struct ec_stripe_head *h,
|
||||||
struct closure *cl)
|
enum alloc_reserve reserve, struct closure *cl)
|
||||||
{
|
{
|
||||||
struct bch_fs *c = trans->c;
|
struct bch_fs *c = trans->c;
|
||||||
struct bch_devs_mask devs = h->devs;
|
struct bch_devs_mask devs = h->devs;
|
||||||
@ -1428,15 +1428,13 @@ static int new_stripe_alloc_buckets(struct btree_trans *trans, struct ec_stripe_
|
|||||||
bool have_cache = true;
|
bool have_cache = true;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
for (i = 0; i < h->s->new_stripe.key.v.nr_blocks; i++) {
|
for_each_set_bit(i, h->s->blocks_gotten, h->s->new_stripe.key.v.nr_blocks) {
|
||||||
if (test_bit(i, h->s->blocks_gotten)) {
|
|
||||||
__clear_bit(h->s->new_stripe.key.v.ptrs[i].dev, devs.d);
|
__clear_bit(h->s->new_stripe.key.v.ptrs[i].dev, devs.d);
|
||||||
if (i < h->s->nr_data)
|
if (i < h->s->nr_data)
|
||||||
nr_have_data++;
|
nr_have_data++;
|
||||||
else
|
else
|
||||||
nr_have_parity++;
|
nr_have_parity++;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
BUG_ON(nr_have_data > h->s->nr_data);
|
BUG_ON(nr_have_data > h->s->nr_data);
|
||||||
BUG_ON(nr_have_parity > h->s->nr_parity);
|
BUG_ON(nr_have_parity > h->s->nr_parity);
|
||||||
@ -1449,9 +1447,7 @@ static int new_stripe_alloc_buckets(struct btree_trans *trans, struct ec_stripe_
|
|||||||
h->s->nr_parity,
|
h->s->nr_parity,
|
||||||
&nr_have_parity,
|
&nr_have_parity,
|
||||||
&have_cache,
|
&have_cache,
|
||||||
h->copygc
|
reserve,
|
||||||
? RESERVE_movinggc
|
|
||||||
: RESERVE_none,
|
|
||||||
0,
|
0,
|
||||||
cl);
|
cl);
|
||||||
|
|
||||||
@ -1478,9 +1474,7 @@ static int new_stripe_alloc_buckets(struct btree_trans *trans, struct ec_stripe_
|
|||||||
h->s->nr_data,
|
h->s->nr_data,
|
||||||
&nr_have_data,
|
&nr_have_data,
|
||||||
&have_cache,
|
&have_cache,
|
||||||
h->copygc
|
reserve,
|
||||||
? RESERVE_movinggc
|
|
||||||
: RESERVE_none,
|
|
||||||
0,
|
0,
|
||||||
cl);
|
cl);
|
||||||
|
|
||||||
@ -1640,7 +1634,7 @@ struct ec_stripe_head *bch2_ec_stripe_head_get(struct btree_trans *trans,
|
|||||||
unsigned target,
|
unsigned target,
|
||||||
unsigned algo,
|
unsigned algo,
|
||||||
unsigned redundancy,
|
unsigned redundancy,
|
||||||
bool copygc,
|
enum alloc_reserve reserve,
|
||||||
struct closure *cl)
|
struct closure *cl)
|
||||||
{
|
{
|
||||||
struct bch_fs *c = trans->c;
|
struct bch_fs *c = trans->c;
|
||||||
@ -1648,7 +1642,7 @@ struct ec_stripe_head *bch2_ec_stripe_head_get(struct btree_trans *trans,
|
|||||||
int ret;
|
int ret;
|
||||||
bool needs_stripe_new;
|
bool needs_stripe_new;
|
||||||
|
|
||||||
h = __bch2_ec_stripe_head_get(trans, target, algo, redundancy, copygc);
|
h = __bch2_ec_stripe_head_get(trans, target, algo, redundancy, reserve);
|
||||||
if (!h)
|
if (!h)
|
||||||
bch_err(c, "no stripe head");
|
bch_err(c, "no stripe head");
|
||||||
if (IS_ERR_OR_NULL(h))
|
if (IS_ERR_OR_NULL(h))
|
||||||
@ -1685,7 +1679,7 @@ struct ec_stripe_head *bch2_ec_stripe_head_get(struct btree_trans *trans,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!h->s->allocated) {
|
if (!h->s->allocated) {
|
||||||
ret = new_stripe_alloc_buckets(trans, h, cl);
|
ret = new_stripe_alloc_buckets(trans, h, reserve, cl);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
|||||||
@ -181,7 +181,7 @@ struct ec_stripe_head {
|
|||||||
unsigned target;
|
unsigned target;
|
||||||
unsigned algo;
|
unsigned algo;
|
||||||
unsigned redundancy;
|
unsigned redundancy;
|
||||||
bool copygc;
|
enum alloc_reserve reserve;
|
||||||
|
|
||||||
struct bch_devs_mask devs;
|
struct bch_devs_mask devs;
|
||||||
unsigned nr_active_devs;
|
unsigned nr_active_devs;
|
||||||
@ -205,7 +205,8 @@ int bch2_ec_stripe_new_alloc(struct bch_fs *, struct ec_stripe_head *);
|
|||||||
|
|
||||||
void bch2_ec_stripe_head_put(struct bch_fs *, struct ec_stripe_head *);
|
void bch2_ec_stripe_head_put(struct bch_fs *, struct ec_stripe_head *);
|
||||||
struct ec_stripe_head *bch2_ec_stripe_head_get(struct btree_trans *,
|
struct ec_stripe_head *bch2_ec_stripe_head_get(struct btree_trans *,
|
||||||
unsigned, unsigned, unsigned, bool, struct closure *);
|
unsigned, unsigned, unsigned,
|
||||||
|
enum alloc_reserve, struct closure *);
|
||||||
|
|
||||||
void bch2_stripes_heap_update(struct bch_fs *, struct stripe *, size_t);
|
void bch2_stripes_heap_update(struct bch_fs *, struct stripe *, size_t);
|
||||||
void bch2_stripes_heap_del(struct bch_fs *, struct stripe *, size_t);
|
void bch2_stripes_heap_del(struct bch_fs *, struct stripe *, size_t);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user