]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bcachefs: bch2_bkey_pick_read_device() can now specify a device
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 29 Dec 2024 00:58:47 +0000 (19:58 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 15 Mar 2025 01:02:12 +0000 (21:02 -0400)
To be used for scrub, where we want the read to come from a specific
device.

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

index 756736f9243d797eb4208772ff9a478241cad915..fc1c01fd2d8dc5802ed7930e203ee34ade42e8e9 100644 (file)
@@ -1352,7 +1352,7 @@ start:
 
                can_retry = bch2_bkey_pick_read_device(c,
                                bkey_i_to_s_c(&b->key),
-                               &failed, &rb->pick) > 0;
+                               &failed, &rb->pick, -1) > 0;
 
                if (!bio->bi_status &&
                    !bch2_btree_node_read_done(c, ca, b, can_retry, &saw_error)) {
@@ -1697,7 +1697,7 @@ void bch2_btree_node_read(struct btree_trans *trans, struct btree *b,
                return;
 
        ret = bch2_bkey_pick_read_device(c, bkey_i_to_s_c(&b->key),
-                                        NULL, &pick);
+                                        NULL, &pick, -1);
 
        if (ret <= 0) {
                struct printbuf buf = PRINTBUF;
index 03a3b62d19a90f0a596e6e0b5123851207e8fb9c..788af88f6979c585ef28c2916fcc735e6e533975 100644 (file)
@@ -191,7 +191,7 @@ void bch2_btree_node_ondisk_to_text(struct printbuf *out, struct bch_fs *c,
        unsigned offset = 0;
        int ret;
 
-       if (bch2_bkey_pick_read_device(c, bkey_i_to_s_c(&b->key), NULL, &pick) <= 0) {
+       if (bch2_bkey_pick_read_device(c, bkey_i_to_s_c(&b->key), NULL, &pick, -1) <= 0) {
                prt_printf(out, "error getting device to read from: invalid device\n");
                return;
        }
index 2d8042f853dcda23f377c5c44e6dfa80c84574c9..ec653109de5b05b2ac9b53efb01e95cee77afabe 100644 (file)
@@ -114,8 +114,9 @@ static inline bool ptr_better(struct bch_fs *c,
  * other devices, it will still pick a pointer from avoid.
  */
 int bch2_bkey_pick_read_device(struct bch_fs *c, struct bkey_s_c k,
-                              struct bch_io_failures *failed,
-                              struct extent_ptr_decoded *pick)
+                             struct bch_io_failures *failed,
+                             struct extent_ptr_decoded *pick,
+                             int dev)
 {
        struct bkey_ptrs_c ptrs = bch2_bkey_ptrs_c(k);
        const union bch_extent_entry *entry;
@@ -137,6 +138,10 @@ int bch2_bkey_pick_read_device(struct bch_fs *c, struct bkey_s_c k,
                        break;
                }
 
+               /* Are we being asked to read from a specific device? */
+               if (dev >= 0 && p.ptr.dev != dev)
+                       continue;
+
                /*
                 * If there are any dirty pointers it's an error if we can't
                 * read:
index 204d765dd74c8ee99bb608d834f6317e3209f359..ed160aaa9546a87e813e164804948edbcbdb7e08 100644 (file)
@@ -404,7 +404,7 @@ void bch2_mark_io_failure(struct bch_io_failures *,
                          struct extent_ptr_decoded *);
 int bch2_bkey_pick_read_device(struct bch_fs *, struct bkey_s_c,
                               struct bch_io_failures *,
-                              struct extent_ptr_decoded *);
+                              struct extent_ptr_decoded *, int);
 
 /* KEY_TYPE_btree_ptr: */
 
index 18c8e54f455e595b7895960e1164eb71dc009e43..67364133148251142c68ec7d4047753452f091ac 100644 (file)
@@ -436,7 +436,7 @@ retry:
                                 bkey_start_pos(&u->k.k->k),
                                 u->btree_id,
                                 bkey_i_to_s_c(u->k.k),
-                                0, failed, flags);
+                                0, failed, flags, -1);
 err:
        bch2_trans_iter_exit(trans, &iter);
 
@@ -872,7 +872,7 @@ int __bch2_read_extent(struct btree_trans *trans, struct bch_read_bio *orig,
                       struct bvec_iter iter, struct bpos read_pos,
                       enum btree_id data_btree, struct bkey_s_c k,
                       unsigned offset_into_extent,
-                      struct bch_io_failures *failed, unsigned flags)
+                      struct bch_io_failures *failed, unsigned flags, int dev)
 {
        struct bch_fs *c = trans->c;
        struct extent_ptr_decoded pick;
@@ -893,7 +893,7 @@ int __bch2_read_extent(struct btree_trans *trans, struct bch_read_bio *orig,
                goto out_read_done;
        }
 retry_pick:
-       pick_ret = bch2_bkey_pick_read_device(c, k, failed, &pick);
+       pick_ret = bch2_bkey_pick_read_device(c, k, failed, &pick, dev);
 
        /* hole or reservation - just zero fill: */
        if (!pick_ret)
@@ -1250,7 +1250,7 @@ void __bch2_read(struct bch_fs *c, struct bch_read_bio *rbio,
 
                ret = __bch2_read_extent(trans, rbio, bvec_iter, iter.pos,
                                         data_btree, k,
-                                        offset_into_extent, failed, flags);
+                                        offset_into_extent, failed, flags, -1);
                if (ret)
                        goto err;
 
index f54c9943e34a8d21d6846a6729f2fa352bc00195..5142f2818b33691b17bd2d0628a8bd74731194f7 100644 (file)
@@ -129,7 +129,7 @@ enum bch_read_flags {
 int __bch2_read_extent(struct btree_trans *, struct bch_read_bio *,
                       struct bvec_iter, struct bpos, enum btree_id,
                       struct bkey_s_c, unsigned,
-                      struct bch_io_failures *, unsigned);
+                      struct bch_io_failures *, unsigned, int);
 
 static inline void bch2_read_extent(struct btree_trans *trans,
                        struct bch_read_bio *rbio, struct bpos read_pos,
@@ -137,7 +137,7 @@ static inline void bch2_read_extent(struct btree_trans *trans,
                        unsigned offset_into_extent, unsigned flags)
 {
        __bch2_read_extent(trans, rbio, rbio->bio.bi_iter, read_pos,
-                          data_btree, k, offset_into_extent, NULL, flags);
+                          data_btree, k, offset_into_extent, NULL, flags, -1);
 }
 
 void __bch2_read(struct bch_fs *, struct bch_read_bio *, struct bvec_iter,