]> www.infradead.org Git - users/hch/dma-mapping.git/commitdiff
bcachefs: BCH_WRITE_ALLOC_NOWAIT no longer applies to open bucket allocation
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 1 Sep 2024 21:32:22 +0000 (17:32 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Sep 2024 15:35:20 +0000 (11:35 -0400)
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: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_foreground.c
fs/bcachefs/errcode.h
fs/bcachefs/io_write.c

index 87400a4b2b8aa532790b005f1d201ccd022d73a2..7ab1200be95d0074c2dd610b957b0015b9447c5d 100644 (file)
@@ -600,6 +600,7 @@ static struct open_bucket *bch2_bucket_alloc_trans(struct btree_trans *trans,
                                      enum bch_watermark watermark,
                                      enum bch_data_type data_type,
                                      struct closure *cl,
+                                     bool nowait,
                                      struct bch_dev_usage *usage)
 {
        struct bch_fs *c = trans->c;
@@ -609,7 +610,7 @@ static struct open_bucket *bch2_bucket_alloc_trans(struct btree_trans *trans,
        struct bucket_alloc_state s = {
                .btree_bitmap = data_type == BCH_DATA_btree,
        };
-       bool waiting = false;
+       bool waiting = nowait;
 again:
        bch2_dev_usage_read_fast(ca, usage);
        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,
 
        bch2_trans_do(c, NULL, NULL, 0,
                      PTR_ERR_OR_ZERO(ob = bch2_bucket_alloc_trans(trans, ca, watermark,
-                                                       data_type, cl, &usage)));
+                                                       data_type, cl, false, &usage)));
        return ob;
 }
 
@@ -800,7 +801,8 @@ int bch2_bucket_alloc_set_trans(struct btree_trans *trans,
                        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))
                        bch2_dev_stripe_increment_inlined(ca, stripe, &usage);
                bch2_dev_put(ca);
@@ -1493,11 +1495,12 @@ err:
            try_decrease_writepoints(trans, write_points_nr))
                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))
-               return cl
-                       ? -BCH_ERR_bucket_alloc_blocked
-                       : -BCH_ERR_ENOSPC_bucket_alloc;
+               ret = -BCH_ERR_bucket_alloc_blocked;
 
        return ret;
 }
index 742dcdd3e5d7d4293379219924b3cf9821c83f89..96be8d600ca0076847a41e58789426986cf7fdcf 100644 (file)
        x(EEXIST,                       EEXIST_str_hash_set)                    \
        x(EEXIST,                       EEXIST_discard_in_flight_add)           \
        x(EEXIST,                       EEXIST_subvolume_create)                \
-       x(0,                            open_buckets_empty)                     \
-       x(0,                            freelist_empty)                         \
+       x(ENOSPC,                       open_buckets_empty)                     \
+       x(ENOSPC,                       freelist_empty)                         \
        x(BCH_ERR_freelist_empty,       no_buckets_found)                       \
        x(0,                            transaction_restart)                    \
        x(BCH_ERR_transaction_restart,  transaction_restart_fault_inject)       \
index 1d4761d150023af0c1a9dca31b765c00683e901a..d3b5be7fd9bf60a85bc99d54f71d7604b9b2aaf0 100644 (file)
@@ -1447,9 +1447,7 @@ again:
                                op->nr_replicas_required,
                                op->watermark,
                                op->flags,
-                               (op->flags & (BCH_WRITE_ALLOC_NOWAIT|
-                                             BCH_WRITE_ONLY_SPECIFIED_DEVS))
-                               ? NULL : &op->cl, &wp));
+                               &op->cl, &wp));
                if (unlikely(ret)) {
                        if (bch2_err_matches(ret, BCH_ERR_operation_blocked))
                                break;
@@ -1592,6 +1590,9 @@ CLOSURE_CALLBACK(bch2_write)
        BUG_ON(!op->write_point.v);
        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->start_time = local_clock();
        bch2_keylist_init(&op->insert_keys, op->inline_keys);