]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Fix self healing on read error
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 31 Dec 2024 23:42:48 +0000 (18:42 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Tue, 14 Jan 2025 15:45:31 +0000 (10:45 -0500)
We were incorrectly checking if there'd been an io error.

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

index 34a3569d085a3d8ee700f9bdd078fb352a79fc7c..8c7b2d3d779df2fbd1e932f84f2025d86f9a3191 100644 (file)
@@ -91,13 +91,18 @@ static const struct rhashtable_params bch_promote_params = {
        .automatic_shrinking    = true,
 };
 
+static inline bool have_io_error(struct bch_io_failures *failed)
+{
+       return failed && failed->nr;
+}
+
 static inline int should_promote(struct bch_fs *c, struct bkey_s_c k,
                                  struct bpos pos,
                                  struct bch_io_opts opts,
                                  unsigned flags,
                                  struct bch_io_failures *failed)
 {
-       if (!failed) {
+       if (!have_io_error(failed)) {
                BUG_ON(!opts.promote_target);
 
                if (!(flags & BCH_READ_MAY_PROMOTE))
@@ -224,7 +229,7 @@ static struct promote_op *__promote_alloc(struct btree_trans *trans,
 
        struct data_update_opts update_opts = {};
 
-       if (!failed) {
+       if (!have_io_error(failed)) {
                update_opts.target = opts.promote_target;
                update_opts.extra_replicas = 1;
                update_opts.write_flags = BCH_WRITE_ALLOC_NOWAIT|BCH_WRITE_CACHED;
@@ -286,7 +291,7 @@ static struct promote_op *promote_alloc(struct btree_trans *trans,
         * if failed != NULL we're not actually doing a promote, we're
         * recovering from an io/checksum error
         */
-       bool promote_full = (failed ||
+       bool promote_full = (have_io_error(failed) ||
                             *read_full ||
                             READ_ONCE(c->opts.promote_whole_extents));
        /* data might have to be decompressed in the write path: */
@@ -989,7 +994,7 @@ retry_pick:
                bounce = true;
        }
 
-       if (orig->opts.promote_target)// || failed)
+       if (orig->opts.promote_target || have_io_error(failed))
                promote = promote_alloc(trans, iter, k, &pick, orig->opts, flags,
                                        &rbio, &bounce, &read_full, failed);