bcachefs: Plumb target parameter through btree_node_rewrite_pos()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 3 Apr 2025 23:42:02 +0000 (19:42 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 00:14:21 +0000 (20:14 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_io.c
fs/bcachefs/btree_update_interior.c
fs/bcachefs/btree_update_interior.h
fs/bcachefs/move.c

index b6f5e0dfc9f1b9c0b2519f87c4f764068e85653a..c1c671e340c7518816879a66494fadad872aa59d 100644 (file)
@@ -1918,7 +1918,7 @@ static void btree_node_scrub_work(struct work_struct *work)
                        bch_err(c, "error validating btree node during scrub on %s at btree %s",
                                scrub->ca->name, err.buf);
 
-                       ret = bch2_btree_node_rewrite(trans, &iter, b, 0);
+                       ret = bch2_btree_node_rewrite(trans, &iter, b, 0, 0);
                }
 err:
                bch2_trans_iter_exit(trans, &iter);
index 2be7c10fc59cba2ac183db46bfbc25f68217cfb3..3155b4360fbc686b08aa9875b0e06071e1087738 100644 (file)
@@ -284,6 +284,7 @@ static struct btree *__bch2_btree_node_alloc(struct btree_trans *trans,
                                             struct disk_reservation *res,
                                             struct closure *cl,
                                             bool interior_node,
+                                            unsigned target,
                                             unsigned flags)
 {
        struct bch_fs *c = trans->c;
@@ -317,6 +318,7 @@ static struct btree *__bch2_btree_node_alloc(struct btree_trans *trans,
        mutex_unlock(&c->btree_reserve_cache_lock);
 retry:
        ret = bch2_alloc_sectors_start_trans(trans,
+                                     target ?:
                                      c->opts.metadata_target ?:
                                      c->opts.foreground_target,
                                      0,
@@ -325,7 +327,9 @@ retry:
                                      res->nr_replicas,
                                      min(res->nr_replicas,
                                          c->opts.metadata_replicas_required),
-                                     watermark, 0, cl, &wp);
+                                     watermark,
+                                     target ? BCH_WRITE_only_specified_devs : 0,
+                                     cl, &wp);
        if (unlikely(ret))
                goto err;
 
@@ -505,6 +509,7 @@ static void bch2_btree_reserve_put(struct btree_update *as, struct btree_trans *
 static int bch2_btree_reserve_get(struct btree_trans *trans,
                                  struct btree_update *as,
                                  unsigned nr_nodes[2],
+                                 unsigned target,
                                  unsigned flags,
                                  struct closure *cl)
 {
@@ -527,7 +532,7 @@ static int bch2_btree_reserve_get(struct btree_trans *trans,
 
                while (p->nr < nr_nodes[interior]) {
                        b = __bch2_btree_node_alloc(trans, &as->disk_res, cl,
-                                                   interior, flags);
+                                                   interior, target, flags);
                        if (IS_ERR(b)) {
                                ret = PTR_ERR(b);
                                goto err;
@@ -1116,7 +1121,8 @@ static void bch2_btree_update_done(struct btree_update *as, struct btree_trans *
 
 static struct btree_update *
 bch2_btree_update_start(struct btree_trans *trans, struct btree_path *path,
-                       unsigned level_start, bool split, unsigned flags)
+                       unsigned level_start, bool split,
+                       unsigned target, unsigned flags)
 {
        struct bch_fs *c = trans->c;
        struct btree_update *as;
@@ -1226,7 +1232,7 @@ bch2_btree_update_start(struct btree_trans *trans, struct btree_path *path,
        if (ret)
                goto err;
 
-       ret = bch2_btree_reserve_get(trans, as, nr_nodes, flags, NULL);
+       ret = bch2_btree_reserve_get(trans, as, nr_nodes, target, flags, NULL);
        if (bch2_err_matches(ret, ENOSPC) ||
            bch2_err_matches(ret, ENOMEM)) {
                struct closure cl;
@@ -1245,7 +1251,7 @@ bch2_btree_update_start(struct btree_trans *trans, struct btree_path *path,
                closure_init_stack(&cl);
 
                do {
-                       ret = bch2_btree_reserve_get(trans, as, nr_nodes, flags, &cl);
+                       ret = bch2_btree_reserve_get(trans, as, nr_nodes, target, flags, &cl);
 
                        bch2_trans_unlock(trans);
                        bch2_wait_on_allocator(c, &cl);
@@ -1878,7 +1884,7 @@ int bch2_btree_split_leaf(struct btree_trans *trans,
 
        as = bch2_btree_update_start(trans, trans->paths + path,
                                     trans->paths[path].level,
-                                    true, flags);
+                                    true, 0, flags);
        if (IS_ERR(as))
                return PTR_ERR(as);
 
@@ -1948,7 +1954,8 @@ int bch2_btree_increase_depth(struct btree_trans *trans, btree_path_idx_t path,
                return bch2_btree_split_leaf(trans, path, flags);
 
        struct btree_update *as =
-               bch2_btree_update_start(trans, trans->paths + path, b->c.level, true, flags);
+               bch2_btree_update_start(trans, trans->paths + path, b->c.level,
+                                       true, 0, flags);
        if (IS_ERR(as))
                return PTR_ERR(as);
 
@@ -2077,7 +2084,7 @@ int __bch2_foreground_maybe_merge(struct btree_trans *trans,
 
        parent = btree_node_parent(trans->paths + path, b);
        as = bch2_btree_update_start(trans, trans->paths + path, level, false,
-                                    BCH_TRANS_COMMIT_no_enospc|flags);
+                                    0, BCH_TRANS_COMMIT_no_enospc|flags);
        ret = PTR_ERR_OR_ZERO(as);
        if (ret)
                goto err;
@@ -2184,6 +2191,7 @@ err:
 int bch2_btree_node_rewrite(struct btree_trans *trans,
                            struct btree_iter *iter,
                            struct btree *b,
+                           unsigned target,
                            unsigned flags)
 {
        struct bch_fs *c = trans->c;
@@ -2196,7 +2204,8 @@ int bch2_btree_node_rewrite(struct btree_trans *trans,
 
        struct btree_path *path = btree_iter_path(trans, iter);
        parent = btree_node_parent(path, b);
-       as = bch2_btree_update_start(trans, path, b->c.level, false, flags);
+       as = bch2_btree_update_start(trans, path, b->c.level,
+                                    false, target, flags);
        ret = PTR_ERR_OR_ZERO(as);
        if (ret)
                goto out;
@@ -2261,7 +2270,7 @@ static int bch2_btree_node_rewrite_key(struct btree_trans *trans,
 
        bool found = b && btree_ptr_hash_val(&b->key) == btree_ptr_hash_val(k);
        ret = found
-               ? bch2_btree_node_rewrite(trans, &iter, b, flags)
+               ? bch2_btree_node_rewrite(trans, &iter, b, 0, flags)
                : -ENOENT;
 out:
        bch2_trans_iter_exit(trans, &iter);
@@ -2270,7 +2279,9 @@ out:
 
 int bch2_btree_node_rewrite_pos(struct btree_trans *trans,
                                enum btree_id btree, unsigned level,
-                               struct bpos pos, unsigned flags)
+                               struct bpos pos,
+                               unsigned target,
+                               unsigned flags)
 {
        BUG_ON(!level);
 
@@ -2282,7 +2293,7 @@ int bch2_btree_node_rewrite_pos(struct btree_trans *trans,
        if (ret)
                goto err;
 
-       ret = bch2_btree_node_rewrite(trans, &iter, b, flags);
+       ret = bch2_btree_node_rewrite(trans, &iter, b, target, flags);
 err:
        bch2_trans_iter_exit(trans, &iter);
        return ret;
@@ -2296,7 +2307,7 @@ int bch2_btree_node_rewrite_key_get_iter(struct btree_trans *trans,
        if (ret)
                return ret == -BCH_ERR_btree_node_dying ? 0 : ret;
 
-       ret = bch2_btree_node_rewrite(trans, &iter, b, flags);
+       ret = bch2_btree_node_rewrite(trans, &iter, b, 0, flags);
        bch2_trans_iter_exit(trans, &iter);
        return ret;
 }
index be71cd73b864d533a2ff56b1dc0255a161113324..ff9b95aac5540688582a17fda09f6acb1330cf0c 100644 (file)
@@ -168,10 +168,10 @@ static inline int bch2_foreground_maybe_merge(struct btree_trans *trans,
 }
 
 int bch2_btree_node_rewrite(struct btree_trans *, struct btree_iter *,
-                           struct btree *, unsigned);
+                           struct btree *, unsigned, unsigned);
 int bch2_btree_node_rewrite_pos(struct btree_trans *,
                                enum btree_id, unsigned,
-                               struct bpos, unsigned);
+                               struct bpos, unsigned, unsigned);
 int bch2_btree_node_rewrite_key_get_iter(struct btree_trans *,
                                         struct btree *, unsigned);
 
index 29981ebcb972d34c57a88265e767cfb9216fa66e..d40e2d14ec528d14afcb693026fa2898f3e9c857 100644 (file)
@@ -872,7 +872,8 @@ static int __bch2_move_data_phys(struct moving_context *ctxt,
                if (!bp.v->level)
                        ret = bch2_move_extent(ctxt, bucket_in_flight, &iter, k, io_opts, data_opts);
                else if (!data_opts.scrub)
-                       ret = bch2_btree_node_rewrite_pos(trans, bp.v->btree_id, bp.v->level, k.k->p, 0);
+                       ret = bch2_btree_node_rewrite_pos(trans, bp.v->btree_id, bp.v->level,
+                                                         k.k->p, data_opts.target, 0);
                else
                        ret = bch2_btree_node_scrub(trans, bp.v->btree_id, bp.v->level, k, data_opts.read_dev);
 
@@ -1022,7 +1023,7 @@ retry:
                        if (!pred(c, arg, b, &io_opts, &data_opts))
                                goto next;
 
-                       ret = bch2_btree_node_rewrite(trans, &iter, b, 0) ?: ret;
+                       ret = bch2_btree_node_rewrite(trans, &iter, b, 0, 0) ?: ret;
                        if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
                                continue;
                        if (ret)