bcachefs: Add an option for metadata_target
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 29 Jan 2021 20:37:28 +0000 (15:37 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:52 +0000 (17:08 -0400)
Also, make journal writes obey foreground_target and metadata_target.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs_format.h
fs/bcachefs/btree_update_interior.c
fs/bcachefs/journal_io.c
fs/bcachefs/opts.h

index a0e445a71c3e9c962a3b501411ee72e4bc0701e9..77af77efdd6d5dbe880b92ad13be459bb1aac884 100644 (file)
@@ -1309,6 +1309,7 @@ LE64_BITMASK(BCH_SB_BACKGROUND_COMPRESSION_TYPE,
 LE64_BITMASK(BCH_SB_GC_RESERVE_BYTES,  struct bch_sb, flags[2],  4, 64);
 
 LE64_BITMASK(BCH_SB_ERASURE_CODE,      struct bch_sb, flags[3],  0, 16);
+LE64_BITMASK(BCH_SB_METADATA_TARGET,   struct bch_sb, flags[3], 16, 28);
 
 /*
  * Features:
index 42015f729da74ab57671724c4f4a93bd1d3c262b..285365ba70122b0b41d4e49e6651490d793b3c17 100644 (file)
@@ -222,7 +222,10 @@ static struct btree *__bch2_btree_node_alloc(struct bch_fs *c,
        mutex_unlock(&c->btree_reserve_cache_lock);
 
 retry:
-       wp = bch2_alloc_sectors_start(c, c->opts.foreground_target, 0,
+       wp = bch2_alloc_sectors_start(c,
+                                     c->opts.metadata_target ?:
+                                     c->opts.foreground_target,
+                                     0,
                                      writepoint_ptr(&c->btree_write_point),
                                      &devs_have,
                                      res->nr_replicas,
index e693ebd332d2207c1ce7730ead53c12133a6d146..252993ffcb1b16d4e9e408ccd667d4b160ce49ac 100644 (file)
@@ -5,6 +5,7 @@
 #include "btree_update_interior.h"
 #include "buckets.h"
 #include "checksum.h"
+#include "disk_groups.h"
 #include "error.h"
 #include "io.h"
 #include "journal.h"
@@ -1031,16 +1032,20 @@ static int journal_write_alloc(struct journal *j, struct journal_buf *w,
                               unsigned sectors)
 {
        struct bch_fs *c = container_of(j, struct bch_fs, journal);
+       struct bch_devs_mask devs;
        struct journal_device *ja;
        struct bch_dev *ca;
        struct dev_alloc_list devs_sorted;
+       unsigned target = c->opts.metadata_target ?:
+               c->opts.foreground_target;
        unsigned i, replicas = 0, replicas_want =
                READ_ONCE(c->opts.metadata_replicas);
 
        rcu_read_lock();
+retry:
+       devs = target_rw_devs(c, BCH_DATA_journal, target);
 
-       devs_sorted = bch2_dev_alloc_list(c, &j->wp.stripe,
-                                         &c->rw_devs[BCH_DATA_journal]);
+       devs_sorted = bch2_dev_alloc_list(c, &j->wp.stripe, &devs);
 
        __journal_write_alloc(j, w, &devs_sorted,
                              sectors, &replicas, replicas_want);
@@ -1072,6 +1077,12 @@ static int journal_write_alloc(struct journal *j, struct journal_buf *w,
 
        __journal_write_alloc(j, w, &devs_sorted,
                              sectors, &replicas, replicas_want);
+
+       if (replicas < replicas_want && target) {
+               /* Retry from all devices: */
+               target = 0;
+               goto retry;
+       }
 done:
        rcu_read_unlock();
 
index e1a46f97f29927230c05887e929fc085197ab3d3..01b93e7eb0277e0185cd3c25eb90459c068e8c90 100644 (file)
@@ -136,6 +136,11 @@ enum opt_type {
          OPT_STR(bch2_str_hash_types),                                 \
          BCH_SB_STR_HASH_TYPE,         BCH_STR_HASH_OPT_SIPHASH,       \
          NULL,         "Hash function for directory entries and xattrs")\
+       x(metadata_target,              u16,                            \
+         OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME|OPT_INODE,                   \
+         OPT_FN(bch2_opt_target),                                      \
+         BCH_SB_METADATA_TARGET,       0,                              \
+         "(target)",   "Device or disk group for metadata writes")     \
        x(foreground_target,            u16,                            \
          OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME|OPT_INODE,                   \
          OPT_FN(bch2_opt_target),                                      \