bcachefs: Don't quash error in bch2_bucket_alloc_set_trans()
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 2 Oct 2022 03:54:46 +0000 (23:54 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:42 +0000 (17:09 -0400)
We were incorrectly returning -BCH_ERR_insufficient_devices when we'd
received a different error from bch2_bucket_alloc_trans(), which
(erronously) turns into -EROFS further up the call chain.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_foreground.c

index 2318d08..0a76575 100644 (file)
@@ -671,7 +671,7 @@ static int bch2_bucket_alloc_set_trans(struct btree_trans *trans,
                bch2_dev_alloc_list(c, stripe, devs_may_alloc);
        unsigned dev;
        struct bch_dev *ca;
-       int ret = 0;
+       int ret = -BCH_ERR_insufficient_devices;
        unsigned i;
 
        BUG_ON(*nr_effective >= nr_replicas);
@@ -701,8 +701,8 @@ static int bch2_bucket_alloc_set_trans(struct btree_trans *trans,
                        bch2_dev_stripe_increment(ca, stripe);
                percpu_ref_put(&ca->ref);
 
-               ret = PTR_ERR_OR_ZERO(ob);
-               if (ret) {
+               if (IS_ERR(ob)) {
+                       ret = PTR_ERR(ob);
                        if (bch2_err_matches(ret, BCH_ERR_transaction_restart) || cl)
                                break;
                        continue;
@@ -711,15 +711,12 @@ static int bch2_bucket_alloc_set_trans(struct btree_trans *trans,
                add_new_bucket(c, ptrs, devs_may_alloc,
                               nr_effective, have_cache, flags, ob);
 
-               if (*nr_effective >= nr_replicas)
+               if (*nr_effective >= nr_replicas) {
+                       ret = 0;
                        break;
+               }
        }
 
-       if (*nr_effective >= nr_replicas)
-               ret = 0;
-       else if (!ret)
-               ret = -BCH_ERR_insufficient_devices;
-
        return ret;
 }