bcachefs: EIO errcode cleanup
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 4 Sep 2024 21:51:47 +0000 (17:51 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Sep 2024 15:39:48 +0000 (11:39 -0400)
We want to be using private errcodes whenever possible, for better error
messages.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/buckets.c
fs/bcachefs/ec.c
fs/bcachefs/errcode.h
fs/bcachefs/extents.c
fs/bcachefs/io_read.c

index 2d1d4dae631bbc89b7f445310b45dfc6287cb28a..0732ac8f682d1c6d32707c58ae315a99e78e5319 100644 (file)
@@ -486,7 +486,7 @@ out:
        return ret;
 err:
        bch2_dump_trans_updates(trans);
-       ret = -EIO;
+       ret = -BCH_ERR_bucket_ref_update;
        goto out;
 }
 
@@ -573,7 +573,7 @@ static int bch2_trigger_pointer(struct btree_trans *trans,
        struct bch_dev *ca = bch2_dev_tryget(c, p.ptr.dev);
        if (unlikely(!ca)) {
                if (insert && p.ptr.dev != BCH_SB_MEMBER_INVALID)
-                       ret = -EIO;
+                       ret = -BCH_ERR_trigger_pointer;
                goto err;
        }
 
@@ -602,7 +602,7 @@ static int bch2_trigger_pointer(struct btree_trans *trans,
                if (bch2_fs_inconsistent_on(!g, c, "reference to invalid bucket on device %u\n  %s",
                                            p.ptr.dev,
                                            (bch2_bkey_val_to_text(&buf, c, k), buf.buf))) {
-                       ret = -EIO;
+                       ret = -BCH_ERR_trigger_pointer;
                        goto err_unlock;
                }
 
@@ -647,7 +647,7 @@ static int bch2_trigger_stripe_ptr(struct btree_trans *trans,
                        bch2_trans_inconsistent(trans,
                                "stripe pointer doesn't match stripe %llu",
                                (u64) p.ec.idx);
-                       ret = -EIO;
+                       ret = -BCH_ERR_trigger_stripe_pointer;
                        goto err;
                }
 
@@ -686,7 +686,7 @@ err:
                                            (u64) p.ec.idx, buf.buf);
                        printbuf_exit(&buf);
                        bch2_inconsistent_error(c);
-                       return -EIO;
+                       return -BCH_ERR_trigger_stripe_pointer;
                }
 
                m->block_sectors[p.ec.block] += sectors;
@@ -966,7 +966,7 @@ static int __bch2_trans_mark_metadata_bucket(struct btree_trans *trans,
                        bch2_data_type_str(a->v.data_type),
                        bch2_data_type_str(type),
                        bch2_data_type_str(type));
-               ret = -EIO;
+               ret = -BCH_ERR_metadata_bucket_inconsistency;
                goto err;
        }
 
@@ -1022,7 +1022,7 @@ err:
        bucket_unlock(g);
 err_unlock:
        percpu_up_read(&c->mark_lock);
-       return -EIO;
+       return -BCH_ERR_metadata_bucket_inconsistency;
 }
 
 int bch2_trans_mark_metadata_bucket(struct btree_trans *trans,
index fa1be6a29d33fd1bce3a07c6a16b2842e492457d..0812d2c76384c7138737a1abd55af9f3759b164a 100644 (file)
@@ -193,7 +193,7 @@ static int __mark_stripe_bucket(struct btree_trans *trans,
                                a->dirty_sectors,
                                a->stripe, s.k->p.offset,
                                (bch2_bkey_val_to_text(&buf, c, s.s_c), buf.buf))) {
-                       ret = -EIO;
+                       ret = -BCH_ERR_mark_stripe;
                        goto err;
                }
 
@@ -204,7 +204,7 @@ static int __mark_stripe_bucket(struct btree_trans *trans,
                                a->dirty_sectors,
                                a->cached_sectors,
                                (bch2_bkey_val_to_text(&buf, c, s.s_c), buf.buf))) {
-                       ret = -EIO;
+                       ret = -BCH_ERR_mark_stripe;
                        goto err;
                }
        } else {
@@ -214,7 +214,7 @@ static int __mark_stripe_bucket(struct btree_trans *trans,
                                bucket.inode, bucket.offset, a->gen,
                                a->stripe,
                                (bch2_bkey_val_to_text(&buf, c, s.s_c), buf.buf))) {
-                       ret = -EIO;
+                       ret = -BCH_ERR_mark_stripe;
                        goto err;
                }
 
@@ -224,7 +224,7 @@ static int __mark_stripe_bucket(struct btree_trans *trans,
                                bch2_data_type_str(a->data_type),
                                bch2_data_type_str(data_type),
                                (bch2_bkey_val_to_text(&buf, c, s.s_c), buf.buf))) {
-                       ret = -EIO;
+                       ret = -BCH_ERR_mark_stripe;
                        goto err;
                }
 
@@ -236,7 +236,7 @@ static int __mark_stripe_bucket(struct btree_trans *trans,
                                a->dirty_sectors,
                                a->cached_sectors,
                                (bch2_bkey_val_to_text(&buf, c, s.s_c), buf.buf))) {
-                       ret = -EIO;
+                       ret = -BCH_ERR_mark_stripe;
                        goto err;
                }
        }
@@ -274,8 +274,8 @@ static int mark_stripe_bucket(struct btree_trans *trans,
 
        struct bch_dev *ca = bch2_dev_tryget(c, ptr->dev);
        if (unlikely(!ca)) {
-               if (!(flags & BTREE_TRIGGER_overwrite))
-                       ret = -EIO;
+               if (ptr->dev != BCH_SB_MEMBER_INVALID && !(flags & BTREE_TRIGGER_overwrite))
+                       ret = -BCH_ERR_mark_stripe;
                goto err;
        }
 
@@ -294,7 +294,7 @@ static int mark_stripe_bucket(struct btree_trans *trans,
                if (bch2_fs_inconsistent_on(!g, c, "reference to invalid bucket on device %u\n  %s",
                                            ptr->dev,
                                            (bch2_bkey_val_to_text(&buf, c, s.s_c), buf.buf))) {
-                       ret = -EIO;
+                       ret = -BCH_ERR_mark_stripe;
                        goto err_unlock;
                }
 
@@ -839,7 +839,7 @@ int bch2_ec_read_extent(struct btree_trans *trans, struct bch_read_bio *rbio)
                bch_err_ratelimited(c,
                        "error doing reconstruct read: error %i looking up stripe", ret);
                kfree(buf);
-               return -EIO;
+               return -BCH_ERR_stripe_reconstruct;
        }
 
        v = &bkey_i_to_stripe(&buf->key)->v;
@@ -847,7 +847,7 @@ int bch2_ec_read_extent(struct btree_trans *trans, struct bch_read_bio *rbio)
        if (!bch2_ptr_matches_stripe(v, rbio->pick)) {
                bch_err_ratelimited(c,
                        "error doing reconstruct read: pointer doesn't match stripe");
-               ret = -EIO;
+               ret = -BCH_ERR_stripe_reconstruct;
                goto err;
        }
 
@@ -855,7 +855,7 @@ int bch2_ec_read_extent(struct btree_trans *trans, struct bch_read_bio *rbio)
        if (offset + bio_sectors(&rbio->bio) > le16_to_cpu(v->sectors)) {
                bch_err_ratelimited(c,
                        "error doing reconstruct read: read is bigger than stripe");
-               ret = -EIO;
+               ret = -BCH_ERR_stripe_reconstruct;
                goto err;
        }
 
@@ -871,7 +871,7 @@ int bch2_ec_read_extent(struct btree_trans *trans, struct bch_read_bio *rbio)
        if (ec_nr_failed(buf) > v->nr_redundant) {
                bch_err_ratelimited(c,
                        "error doing reconstruct read: unable to read enough blocks");
-               ret = -EIO;
+               ret = -BCH_ERR_stripe_reconstruct;
                goto err;
        }
 
index 96be8d600ca0076847a41e58789426986cf7fdcf..5241910c1cb029c637a81aa86a1714a0c71a0f91 100644 (file)
        x(EIO,                          btree_node_read_error)                  \
        x(EIO,                          btree_node_read_validate_error)         \
        x(EIO,                          btree_need_topology_repair)             \
+       x(EIO,                          bucket_ref_update)                      \
+       x(EIO,                          trigger_pointer)                        \
+       x(EIO,                          trigger_stripe_pointer)                 \
+       x(EIO,                          metadata_bucket_inconsistency)          \
+       x(EIO,                          mark_stripe)                            \
+       x(EIO,                          stripe_reconstruct)                     \
+       x(EIO,                          key_type_error)                         \
+       x(EIO,                          no_device_to_read_from)                 \
+       x(EIO,                          missing_indirect_extent)                \
        x(BCH_ERR_btree_node_read_err,  btree_node_read_err_fixable)            \
        x(BCH_ERR_btree_node_read_err,  btree_node_read_err_want_retry)         \
        x(BCH_ERR_btree_node_read_err,  btree_node_read_err_must_retry)         \
index ad63445b85e517b70865992b11996808d05077e6..d370d679e0155bebf4022b9ee1e9d96a0b9eb7e3 100644 (file)
@@ -115,7 +115,7 @@ int bch2_bkey_pick_read_device(struct bch_fs *c, struct bkey_s_c k,
        int ret = 0;
 
        if (k.k->type == KEY_TYPE_error)
-               return -EIO;
+               return -BCH_ERR_key_type_error;
 
        rcu_read_lock();
        bkey_for_each_ptr_decode(k.k, ptrs, p, entry) {
@@ -133,7 +133,7 @@ int bch2_bkey_pick_read_device(struct bch_fs *c, struct bkey_s_c k,
                 * read:
                 */
                if (!ret && !p.ptr.cached)
-                       ret = -EIO;
+                       ret = -BCH_ERR_no_device_to_read_from;
 
                struct bch_dev *ca = bch2_dev_rcu(c, p.ptr.dev);
 
@@ -146,16 +146,13 @@ int bch2_bkey_pick_read_device(struct bch_fs *c, struct bkey_s_c k,
                                ? f->idx
                                : f->idx + 1;
 
-               if (!p.idx && !ca)
+               if (!p.idx && (!ca || !bch2_dev_is_readable(ca)))
                        p.idx++;
 
                if (!p.idx && p.has_ec && bch2_force_reconstruct_read)
                        p.idx++;
 
-               if (!p.idx && !bch2_dev_is_readable(ca))
-                       p.idx++;
-
-               if (p.idx >= (unsigned) p.has_ec + 1)
+               if (p.idx > (unsigned) p.has_ec)
                        continue;
 
                if (ret > 0 && !ptr_better(c, p, *pick))
index 10242671b269ebdf288cd3f9aebb00e42cd0fed8..b3fba16b157bea31f0a03e8325aeb1cba9f35fa2 100644 (file)
@@ -777,7 +777,7 @@ int __bch2_read_indirect_extent(struct btree_trans *trans,
                        orig_k->k->k.size,
                        reflink_offset);
                bch2_inconsistent_error(trans->c);
-               ret = -EIO;
+               ret = -BCH_ERR_missing_indirect_extent;
                goto err;
        }