]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to 969fbff4ef bcachefs: Print message on btree node read...
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 26 May 2022 21:47:22 +0000 (17:47 -0400)
committerKent Overstreet <kent.overstreet@gmail.com>
Thu, 26 May 2022 21:47:22 +0000 (17:47 -0400)
12 files changed:
.bcachefs_revision
libbcachefs/bcachefs_format.h
libbcachefs/btree_io.c
libbcachefs/btree_iter.c
libbcachefs/btree_iter.h
libbcachefs/btree_types.h
libbcachefs/btree_update_leaf.c
libbcachefs/checksum.c
libbcachefs/opts.h
libbcachefs/recovery.c
libbcachefs/recovery.h
libbcachefs/super-io.c

index c1cb5fdbb73093fdd4077755aa316297483293d7..96185653140f2efe0df228939c8393ff57f907df 100644 (file)
@@ -1 +1 @@
-40eaef7e8049b75ff7e5da42227295c754d9c906
+969fbff4ef3a75ae25ef7cca17dd4e028443bfc2
index 1bea79cf4f6aa35efdd318bf376e994b441bd3a9..f9fde1281ec913ccf4cc0bef4a0c3957fbab691d 100644 (file)
@@ -1553,6 +1553,7 @@ LE64_BITMASK(BCH_SB_INODES_USE_KEY_CACHE,struct bch_sb, flags[3], 29, 30);
 LE64_BITMASK(BCH_SB_JOURNAL_FLUSH_DELAY,struct bch_sb, flags[3], 30, 62);
 LE64_BITMASK(BCH_SB_JOURNAL_FLUSH_DISABLED,struct bch_sb, flags[3], 62, 63);
 LE64_BITMASK(BCH_SB_JOURNAL_RECLAIM_DELAY,struct bch_sb, flags[4], 0, 32);
+/* Obsolete, always enabled: */
 LE64_BITMASK(BCH_SB_JOURNAL_TRANSACTION_NAMES,struct bch_sb, flags[4], 32, 33);
 
 /*
index 7a883922bb0914b4deff3abab20c79efadb79fe0..ff390c51688fa8b55d194f44dad43557f0772bf2 100644 (file)
@@ -1146,10 +1146,12 @@ static void btree_node_read_work(struct work_struct *work)
        struct bch_io_failures failed = { .nr = 0 };
        struct printbuf buf = PRINTBUF;
        bool saw_error = false;
+       bool retry = false;
        bool can_retry;
 
        goto start;
        while (1) {
+               retry = true;
                bch_info(c, "retrying read");
                ca = bch_dev_bkey_exists(c, rb->pick.ptr.dev);
                rb->have_ioref          = bch2_dev_get_ioref(ca, READ);
@@ -1180,8 +1182,11 @@ start:
                                &failed, &rb->pick) > 0;
 
                if (!bio->bi_status &&
-                   !bch2_btree_node_read_done(c, ca, b, can_retry))
+                   !bch2_btree_node_read_done(c, ca, b, can_retry)) {
+                       if (retry)
+                               bch_info(c, "retry success");
                        break;
+               }
 
                saw_error = true;
 
index e7541af9518f7b91d72380c2fdb89dca9aa1f1d7..b81a55b2fec6929a3063ff34e0fb0a0b4450b60d 100644 (file)
@@ -2248,14 +2248,38 @@ static inline struct bkey_i *btree_trans_peek_updates(struct btree_trans *trans,
        return NULL;
 }
 
+struct bkey_i *bch2_btree_journal_peek(struct btree_trans *trans,
+                                      struct btree_iter *iter,
+                                      struct bpos start_pos,
+                                      struct bpos end_pos)
+{
+       struct bkey_i *k;
+
+       if (bpos_cmp(start_pos, iter->journal_pos) < 0)
+               iter->journal_idx = 0;
+
+       k = bch2_journal_keys_peek_upto(trans->c, iter->btree_id, 0,
+                                       start_pos, end_pos,
+                                       &iter->journal_idx);
+
+       iter->journal_pos = k ? k->k.p : end_pos;
+       return k;
+}
+
+struct bkey_i *bch2_btree_journal_peek_slot(struct btree_trans *trans,
+                                           struct btree_iter *iter,
+                                           struct bpos pos)
+{
+       return bch2_btree_journal_peek(trans, iter, pos, pos);
+}
+
 static noinline
 struct bkey_s_c btree_trans_peek_journal(struct btree_trans *trans,
                                         struct btree_iter *iter,
                                         struct bkey_s_c k)
 {
        struct bkey_i *next_journal =
-               bch2_journal_keys_peek_upto(trans->c, iter->btree_id, 0,
-                               iter->path->pos,
+               bch2_btree_journal_peek(trans, iter, iter->path->pos,
                                k.k ? k.k->p : iter->path->l[0].b->key.k.p);
 
        if (next_journal) {
@@ -2804,10 +2828,8 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
                }
 
                if (unlikely(iter->flags & BTREE_ITER_WITH_JOURNAL) &&
-                   (next_update = bch2_journal_keys_peek_slot(trans->c,
-                                       iter->btree_id,
-                                       iter->path->level,
-                                       iter->pos))) {
+                   (next_update = bch2_btree_journal_peek_slot(trans,
+                                       iter, iter->pos))) {
                        iter->k = next_update->k;
                        k = bkey_i_to_s_c(next_update);
                        goto out;
@@ -3074,6 +3096,8 @@ static void __bch2_trans_iter_init(struct btree_trans *trans,
        iter->k.type    = KEY_TYPE_deleted;
        iter->k.p       = pos;
        iter->k.size    = 0;
+       iter->journal_idx = 0;
+       iter->journal_pos = POS_MIN;
 #ifdef CONFIG_BCACHEFS_DEBUG
        iter->ip_allocated = ip;
 #endif
index dad05ea003570402ea582e7887529e09ec8dc53b..f2b302c8150c206418eb9720852f671c5c46bf3f 100644 (file)
@@ -138,6 +138,9 @@ struct btree_path *bch2_path_get(struct btree_trans *, enum btree_id, struct bpo
                                 unsigned, unsigned, unsigned, unsigned long);
 inline struct bkey_s_c bch2_btree_path_peek_slot(struct btree_path *, struct bkey *);
 
+struct bkey_i *bch2_btree_journal_peek_slot(struct btree_trans *,
+                                       struct btree_iter *, struct bpos);
+
 #ifdef CONFIG_BCACHEFS_DEBUG
 void bch2_trans_verify_paths(struct btree_trans *);
 void bch2_trans_verify_locks(struct btree_trans *);
index e4ed46a4f870847019fa9346a3b853673bd7c6d5..a1c0441940a56e48414ebfbf5a38d20a951b9ffb 100644 (file)
@@ -292,6 +292,10 @@ struct btree_iter {
         * bch2_btree_iter_next_slot() can correctly advance pos.
         */
        struct bkey             k;
+
+       /* BTREE_ITER_WITH_JOURNAL: */
+       size_t                  journal_idx;
+       struct bpos             journal_pos;
 #ifdef CONFIG_BCACHEFS_DEBUG
        unsigned long           ip_allocated;
 #endif
@@ -393,7 +397,6 @@ struct btree_trans {
        bool                    in_traverse_all:1;
        bool                    restarted:1;
        bool                    memory_allocation_failure:1;
-       bool                    journal_transaction_names:1;
        bool                    is_initial_gc:1;
        /*
         * For when bch2_trans_update notices we'll be splitting a compressed
index 58bb687a3a8fe8c5f892b3f2ca598efcf7040092..e34bc9672f802935853a8babe8433e9e602ba217 100644 (file)
@@ -305,7 +305,7 @@ static inline int bch2_trans_journal_res_get(struct btree_trans *trans,
 
 #define JSET_ENTRY_LOG_U64s            4
 
-static noinline void journal_transaction_name(struct btree_trans *trans)
+static void journal_transaction_name(struct btree_trans *trans)
 {
        struct bch_fs *c = trans->c;
        struct jset_entry *entry = journal_res_entry(&c->journal, &trans->journal_res);
@@ -684,8 +684,7 @@ bch2_trans_commit_write_locked(struct btree_trans *trans,
                if (ret)
                        return ret;
 
-               if (unlikely(trans->journal_transaction_names))
-                       journal_transaction_name(trans);
+               journal_transaction_name(trans);
        } else {
                trans->journal_res.seq = c->journal.replay_journal_seq;
        }
@@ -1118,10 +1117,8 @@ int __bch2_trans_commit(struct btree_trans *trans)
        trans->journal_u64s             = trans->extra_journal_entries.nr;
        trans->journal_preres_u64s      = 0;
 
-       trans->journal_transaction_names = READ_ONCE(c->opts.journal_transaction_names);
-
-       if (trans->journal_transaction_names)
-               trans->journal_u64s += JSET_ENTRY_LOG_U64s;
+       /* For journalling transaction name: */
+       trans->journal_u64s += JSET_ENTRY_LOG_U64s;
 
        trans_for_each_update(trans, i) {
                BUG_ON(!i->path->should_be_locked);
index 50157b4013a5d6b0d138d21cbee3a71d763be96d..317efd047a463a0f12b214b826d144671f5438dc 100644 (file)
@@ -116,7 +116,12 @@ static inline int do_encrypt(struct crypto_sync_skcipher *tfm,
 {
        struct scatterlist sg;
 
-       sg_init_one(&sg, buf, len);
+       sg_init_table(&sg, 1);
+       sg_set_page(&sg,
+                   is_vmalloc_addr(buf)
+                   ? vmalloc_to_page(buf)
+                   : virt_to_page(buf),
+                   len, offset_in_page(buf));
        return do_encrypt_sg(tfm, nonce, &sg, len);
 }
 
index 6a1cd41e63749b817df4202b55954b1786909925..54e3575f4d0a944c45cea923109b36b5b4ad0579 100644 (file)
@@ -165,22 +165,22 @@ enum opt_type {
          OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME,            \
          OPT_FN(bch2_opt_target),                                      \
          BCH_SB_METADATA_TARGET,       0,                              \
-         "(target)",   "Device or disk group for metadata writes")     \
+         "(target)",   "Device or label for metadata writes")          \
        x(foreground_target,            u16,                            \
          OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME,            \
          OPT_FN(bch2_opt_target),                                      \
          BCH_SB_FOREGROUND_TARGET,     0,                              \
-         "(target)",   "Device or disk group for foreground writes")   \
+         "(target)",   "Device or label for foreground writes")        \
        x(background_target,            u16,                            \
          OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME,            \
          OPT_FN(bch2_opt_target),                                      \
          BCH_SB_BACKGROUND_TARGET,     0,                              \
-         "(target)",   "Device or disk group to move data to in the background")\
+         "(target)",   "Device or label to move data to in the background")\
        x(promote_target,               u16,                            \
          OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME,            \
          OPT_FN(bch2_opt_target),                                      \
          BCH_SB_PROMOTE_TARGET,        0,                              \
-         "(target)",   "Device or disk group to promote data to on read")\
+         "(target)",   "Device or label to promote data to on read")   \
        x(erasure_code,                 u16,                            \
          OPT_FS|OPT_INODE|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME,            \
          OPT_BOOL(),                                                   \
@@ -331,11 +331,6 @@ enum opt_type {
          OPT_BOOL(),                                                   \
          BCH2_NO_SB_OPT,                       false,                          \
          NULL,         "Only read the journal, skip the rest of recovery")\
-       x(journal_transaction_names,    u8,                             \
-         OPT_FS|OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME,                      \
-         OPT_BOOL(),                                                   \
-         BCH_SB_JOURNAL_TRANSACTION_NAMES, true,                       \
-         NULL,         "Log transaction function names in journal")    \
        x(noexcl,                       u8,                             \
          OPT_FS|OPT_MOUNT,                                             \
          OPT_BOOL(),                                                   \
index 36ab2e3bbc6d361046fc6cdde71cf9142e6ef447..04afe2453b0bc54756edb98dd767272fd82eecd6 100644 (file)
@@ -86,9 +86,9 @@ static inline struct journal_key *idx_to_key(struct journal_keys *keys, size_t i
        return keys->d + idx_to_pos(keys, idx);
 }
 
-size_t bch2_journal_key_search(struct journal_keys *keys,
-                              enum btree_id id, unsigned level,
-                              struct bpos pos)
+static size_t bch2_journal_key_search(struct journal_keys *keys,
+                                     enum btree_id id, unsigned level,
+                                     struct bpos pos)
 {
        size_t l = 0, r = keys->nr, m;
 
@@ -111,21 +111,31 @@ size_t bch2_journal_key_search(struct journal_keys *keys,
 
 struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *c, enum btree_id btree_id,
                                           unsigned level, struct bpos pos,
-                                          struct bpos end_pos)
+                                          struct bpos end_pos, size_t *idx)
 {
        struct journal_keys *keys = &c->journal_keys;
-       size_t idx = bch2_journal_key_search(keys, btree_id, level, pos);
-
-       while (idx < keys->size &&
-              keys->d[idx].btree_id == btree_id &&
-              keys->d[idx].level == level &&
-              bpos_cmp(keys->d[idx].k->k.p, end_pos) <= 0) {
-               if (!keys->d[idx].overwritten)
-                       return keys->d[idx].k;
-
-               idx++;
-               if (idx == keys->gap)
-                       idx += keys->size - keys->nr;
+       unsigned iters = 0;
+search:
+       if (!*idx)
+               *idx = bch2_journal_key_search(keys, btree_id, level, pos);
+
+       while (*idx < keys->size &&
+              keys->d[*idx].btree_id == btree_id &&
+              keys->d[*idx].level == level &&
+              bpos_cmp(keys->d[*idx].k->k.p, end_pos) <= 0) {
+               if (bpos_cmp(keys->d[*idx].k->k.p, pos) >= 0 &&
+                   !keys->d[*idx].overwritten)
+                       return keys->d[*idx].k;
+
+               (*idx)++;
+               if (*idx == keys->gap)
+                       *idx += keys->size - keys->nr;
+
+               iters++;
+               if (iters == 10) {
+                       *idx = 0;
+                       goto search;
+               }
        }
 
        return NULL;
@@ -134,7 +144,9 @@ struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *c, enum btree_id btree
 struct bkey_i *bch2_journal_keys_peek_slot(struct bch_fs *c, enum btree_id btree_id,
                                           unsigned level, struct bpos pos)
 {
-       return bch2_journal_keys_peek_upto(c, btree_id, level, pos, pos);
+       size_t idx = 0;
+
+       return bch2_journal_keys_peek_upto(c, btree_id, level, pos, pos, &idx);
 }
 
 static void journal_iters_fix(struct bch_fs *c)
@@ -1246,7 +1258,7 @@ use_clean:
 
                set_bit(BCH_FS_MAY_GO_RW, &c->flags);
 
-               bch_verbose(c, "starting journal replay, %zu keys", c->journal_keys.nr);
+               bch_info(c, "starting journal replay, %zu keys", c->journal_keys.nr);
                err = "journal replay failed";
                ret = bch2_journal_replay(c);
                if (ret)
index e05aac64185d327e3aef1e4bc2aff2f9dae2ed30..52db06b29310f5f9449914bab965d2d2427b959d 100644 (file)
@@ -28,10 +28,8 @@ struct btree_and_journal_iter {
        }                       last;
 };
 
-size_t bch2_journal_key_search(struct journal_keys *, enum btree_id,
-                              unsigned, struct bpos);
 struct bkey_i *bch2_journal_keys_peek_upto(struct bch_fs *, enum btree_id,
-                                          unsigned, struct bpos, struct bpos);
+                               unsigned, struct bpos, struct bpos, size_t *);
 struct bkey_i *bch2_journal_keys_peek_slot(struct bch_fs *, enum btree_id,
                                           unsigned, struct bpos);
 
index a2b789b4ac68a344dde31b82ffe1687373f0eecc..0b9fbb52ec1afeaef484f4936f948453b7e8320b 100644 (file)
@@ -1058,7 +1058,7 @@ static void bch2_sb_members_to_text(struct printbuf *out, struct bch_sb *sb,
                       : "unknown");
                pr_newline(out);
 
-               pr_buf(out, "Group:");
+               pr_buf(out, "Label:");
                pr_tab(out);
                if (BCH_MEMBER_GROUP(m)) {
                        unsigned idx = BCH_MEMBER_GROUP(m) - 1;