bcachefs: Add an option for whether inodes use the key cache
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 13 Jun 2021 21:07:18 +0000 (17:07 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:08 +0000 (17:09 -0400)
We probably don't ever want to flip this off in production, but it may
be useful for certain kinds of testing.

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

index 24853bd8923b5c71bb37b764406bb2edd8517461..e6be594fd0be8100653199d8f15cd60ffe0ffbfd 100644 (file)
@@ -1350,6 +1350,7 @@ 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);
 LE64_BITMASK(BCH_SB_SHARD_INUMS,       struct bch_sb, flags[3], 28, 29);
+LE64_BITMASK(BCH_SB_INODES_USE_KEY_CACHE,struct bch_sb, flags[3], 29, 30);
 
 /*
  * Features:
index 565aebba30e6087e48497c75112532ca00dd5083..8c6627907431db1913f85413046febc60f2073b2 100644 (file)
@@ -300,8 +300,10 @@ struct btree_iter *bch2_inode_peek(struct btree_trans *trans,
        struct bkey_s_c k;
        int ret;
 
-       iter = bch2_trans_get_iter(trans, BTREE_ID_inodes, POS(0, inum),
-                                  BTREE_ITER_CACHED|flags);
+       if (trans->c->opts.inodes_use_key_cache)
+               flags |= BTREE_ITER_CACHED;
+
+       iter = bch2_trans_get_iter(trans, BTREE_ID_inodes, POS(0, inum), flags);
        k = bch2_btree_iter_peek_slot(iter);
        ret = bkey_err(k);
        if (ret)
@@ -577,8 +579,12 @@ int bch2_inode_rm(struct bch_fs *c, u64 inode_nr, bool cached)
        struct bpos end = POS(inode_nr + 1, 0);
        struct bch_inode_unpacked inode_u;
        struct bkey_s_c k;
+       unsigned iter_flags = BTREE_ITER_INTENT;
        int ret;
 
+       if (cached && c->opts.inodes_use_key_cache)
+               iter_flags |= BTREE_ITER_CACHED;
+
        bch2_trans_init(&trans, c, 0, 1024);
 
        /*
@@ -600,11 +606,8 @@ int bch2_inode_rm(struct bch_fs *c, u64 inode_nr, bool cached)
 retry:
        bch2_trans_begin(&trans);
 
-       iter = bch2_trans_get_iter(&trans, BTREE_ID_inodes, POS(0, inode_nr),
-                                  (cached
-                                   ? BTREE_ITER_CACHED
-                                   : BTREE_ITER_SLOTS)|
-                                  BTREE_ITER_INTENT);
+       iter = bch2_trans_get_iter(&trans, BTREE_ID_inodes,
+                                  POS(0, inode_nr), iter_flags);
        k = bch2_btree_iter_peek_slot(iter);
 
        ret = bkey_err(k);
index 707659e31893aec47c34ed92a364ca1365f321c8..2cba0e137b58995c9016e034651de3da51779130 100644 (file)
@@ -173,6 +173,11 @@ enum opt_type {
          OPT_BOOL(),                                                   \
          BCH_SB_SHARD_INUMS,           false,                          \
          NULL,         "Shard new inode numbers by CPU id")            \
+       x(inodes_use_key_cache, u8,                                     \
+         OPT_FORMAT|OPT_MOUNT,                                         \
+         OPT_BOOL(),                                                   \
+         BCH_SB_INODES_USE_KEY_CACHE,  true,                           \
+         NULL,         "Use the btree key cache for the inodes btree") \
        x(gc_reserve_percent,           u8,                             \
          OPT_FORMAT|OPT_MOUNT|OPT_RUNTIME,                             \
          OPT_UINT(5, 21),                                              \