Commit a977f3e1 authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: BCH_WRITE_ALLOC_NOWAIT no longer applies to open bucket allocation

rebalance writes must be BCH_WRITE_ALLOC_NOWAIT because they don't
allocate from the full filesystem - but we don't want spurious
allocation failures due to open buckets.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 2e95497e
...@@ -600,6 +600,7 @@ static struct open_bucket *bch2_bucket_alloc_trans(struct btree_trans *trans, ...@@ -600,6 +600,7 @@ static struct open_bucket *bch2_bucket_alloc_trans(struct btree_trans *trans,
enum bch_watermark watermark, enum bch_watermark watermark,
enum bch_data_type data_type, enum bch_data_type data_type,
struct closure *cl, struct closure *cl,
bool nowait,
struct bch_dev_usage *usage) struct bch_dev_usage *usage)
{ {
struct bch_fs *c = trans->c; struct bch_fs *c = trans->c;
...@@ -609,7 +610,7 @@ static struct open_bucket *bch2_bucket_alloc_trans(struct btree_trans *trans, ...@@ -609,7 +610,7 @@ static struct open_bucket *bch2_bucket_alloc_trans(struct btree_trans *trans,
struct bucket_alloc_state s = { struct bucket_alloc_state s = {
.btree_bitmap = data_type == BCH_DATA_btree, .btree_bitmap = data_type == BCH_DATA_btree,
}; };
bool waiting = false; bool waiting = nowait;
again: again:
bch2_dev_usage_read_fast(ca, usage); bch2_dev_usage_read_fast(ca, usage);
avail = dev_buckets_free(ca, *usage, watermark); avail = dev_buckets_free(ca, *usage, watermark);
...@@ -685,7 +686,7 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca, ...@@ -685,7 +686,7 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca,
bch2_trans_do(c, NULL, NULL, 0, bch2_trans_do(c, NULL, NULL, 0,
PTR_ERR_OR_ZERO(ob = bch2_bucket_alloc_trans(trans, ca, watermark, PTR_ERR_OR_ZERO(ob = bch2_bucket_alloc_trans(trans, ca, watermark,
data_type, cl, &usage))); data_type, cl, false, &usage)));
return ob; return ob;
} }
...@@ -800,7 +801,8 @@ int bch2_bucket_alloc_set_trans(struct btree_trans *trans, ...@@ -800,7 +801,8 @@ int bch2_bucket_alloc_set_trans(struct btree_trans *trans,
continue; continue;
} }
ob = bch2_bucket_alloc_trans(trans, ca, watermark, data_type, cl, &usage); ob = bch2_bucket_alloc_trans(trans, ca, watermark, data_type,
cl, flags & BCH_WRITE_ALLOC_NOWAIT, &usage);
if (!IS_ERR(ob)) if (!IS_ERR(ob))
bch2_dev_stripe_increment_inlined(ca, stripe, &usage); bch2_dev_stripe_increment_inlined(ca, stripe, &usage);
bch2_dev_put(ca); bch2_dev_put(ca);
...@@ -1493,11 +1495,12 @@ int bch2_alloc_sectors_start_trans(struct btree_trans *trans, ...@@ -1493,11 +1495,12 @@ int bch2_alloc_sectors_start_trans(struct btree_trans *trans,
try_decrease_writepoints(trans, write_points_nr)) try_decrease_writepoints(trans, write_points_nr))
goto retry; goto retry;
if (bch2_err_matches(ret, BCH_ERR_open_buckets_empty) || if (cl && bch2_err_matches(ret, BCH_ERR_open_buckets_empty))
ret = -BCH_ERR_bucket_alloc_blocked;
if (cl && !(flags & BCH_WRITE_ALLOC_NOWAIT) &&
bch2_err_matches(ret, BCH_ERR_freelist_empty)) bch2_err_matches(ret, BCH_ERR_freelist_empty))
return cl ret = -BCH_ERR_bucket_alloc_blocked;
? -BCH_ERR_bucket_alloc_blocked
: -BCH_ERR_ENOSPC_bucket_alloc;
return ret; return ret;
} }
......
...@@ -119,8 +119,8 @@ ...@@ -119,8 +119,8 @@
x(EEXIST, EEXIST_str_hash_set) \ x(EEXIST, EEXIST_str_hash_set) \
x(EEXIST, EEXIST_discard_in_flight_add) \ x(EEXIST, EEXIST_discard_in_flight_add) \
x(EEXIST, EEXIST_subvolume_create) \ x(EEXIST, EEXIST_subvolume_create) \
x(0, open_buckets_empty) \ x(ENOSPC, open_buckets_empty) \
x(0, freelist_empty) \ x(ENOSPC, freelist_empty) \
x(BCH_ERR_freelist_empty, no_buckets_found) \ x(BCH_ERR_freelist_empty, no_buckets_found) \
x(0, transaction_restart) \ x(0, transaction_restart) \
x(BCH_ERR_transaction_restart, transaction_restart_fault_inject) \ x(BCH_ERR_transaction_restart, transaction_restart_fault_inject) \
......
...@@ -1447,9 +1447,7 @@ static void __bch2_write(struct bch_write_op *op) ...@@ -1447,9 +1447,7 @@ static void __bch2_write(struct bch_write_op *op)
op->nr_replicas_required, op->nr_replicas_required,
op->watermark, op->watermark,
op->flags, op->flags,
(op->flags & (BCH_WRITE_ALLOC_NOWAIT| &op->cl, &wp));
BCH_WRITE_ONLY_SPECIFIED_DEVS))
? NULL : &op->cl, &wp));
if (unlikely(ret)) { if (unlikely(ret)) {
if (bch2_err_matches(ret, BCH_ERR_operation_blocked)) if (bch2_err_matches(ret, BCH_ERR_operation_blocked))
break; break;
...@@ -1592,6 +1590,9 @@ CLOSURE_CALLBACK(bch2_write) ...@@ -1592,6 +1590,9 @@ CLOSURE_CALLBACK(bch2_write)
BUG_ON(!op->write_point.v); BUG_ON(!op->write_point.v);
BUG_ON(bkey_eq(op->pos, POS_MAX)); BUG_ON(bkey_eq(op->pos, POS_MAX));
if (op->flags & BCH_WRITE_ONLY_SPECIFIED_DEVS)
op->flags |= BCH_WRITE_ALLOC_NOWAIT;
op->nr_replicas_required = min_t(unsigned, op->nr_replicas_required, op->nr_replicas); op->nr_replicas_required = min_t(unsigned, op->nr_replicas_required, op->nr_replicas);
op->start_time = local_clock(); op->start_time = local_clock();
bch2_keylist_init(&op->insert_keys, op->inline_keys); bch2_keylist_init(&op->insert_keys, op->inline_keys);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment