bcachefs: Don't use bkey cache for inode update in fsck
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 21 Nov 2020 02:21:28 +0000 (21:21 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:48 +0000 (17:08 -0400)
fsck doesn't know about the btree key cache, and non-cached iterators
aren't cache coherent (yet?)

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

index 480469784152a6a3f0803d192f4fad518da05788..a3810493826b1681975accaa46669381f870117d 100644 (file)
@@ -1262,7 +1262,7 @@ static void bch2_evict_inode(struct inode *vinode)
                                KEY_TYPE_QUOTA_WARN);
                bch2_quota_acct(c, inode->ei_qid, Q_INO, -1,
                                KEY_TYPE_QUOTA_WARN);
-               bch2_inode_rm(c, inode->v.i_ino);
+               bch2_inode_rm(c, inode->v.i_ino, true);
        }
 }
 
index 0c503527084656ad62f189134e904176c0e8e2d6..09ce6c29b88cf91e85a57d6c9abce4b7bf56fa5d 100644 (file)
@@ -1254,7 +1254,7 @@ static int check_inode(struct btree_trans *trans,
 
                bch2_fs_lazy_rw(c);
 
-               ret = bch2_inode_rm(c, u.bi_inum);
+               ret = bch2_inode_rm(c, u.bi_inum, false);
                if (ret)
                        bch_err(c, "error in fsck: error %i while deleting inode", ret);
                return ret;
index f00778d782712645fd6b723e65b5d9686313305d..b1f420776d9aafabac29d90a6a7c4647852af636 100644 (file)
@@ -542,7 +542,7 @@ found_slot:
        return ret;
 }
 
-int bch2_inode_rm(struct bch_fs *c, u64 inode_nr)
+int bch2_inode_rm(struct bch_fs *c, u64 inode_nr, bool cached)
 {
        struct btree_trans trans;
        struct btree_iter *iter;
@@ -576,9 +576,15 @@ retry:
 
        bi_generation = 0;
 
-       iter = bch2_trans_get_iter(&trans, BTREE_ID_INODES, POS(0, inode_nr),
-                                  BTREE_ITER_CACHED|BTREE_ITER_INTENT);
-       k = bch2_btree_iter_peek_cached(iter);
+       if (cached) {
+               iter = bch2_trans_get_iter(&trans, BTREE_ID_INODES, POS(0, inode_nr),
+                                          BTREE_ITER_CACHED|BTREE_ITER_INTENT);
+               k = bch2_btree_iter_peek_cached(iter);
+       } else {
+               iter = bch2_trans_get_iter(&trans, BTREE_ID_INODES, POS(0, inode_nr),
+                                          BTREE_ITER_SLOTS|BTREE_ITER_INTENT);
+               k = bch2_btree_iter_peek_slot(iter);
+       }
 
        ret = bkey_err(k);
        if (ret)
index ef7e885dce0c87e671248f30f9debbaaf13b2dc9..dbdfcf63d07992fc2e0a5a070fd593f3c0e3b404 100644 (file)
@@ -71,7 +71,7 @@ void bch2_inode_init(struct bch_fs *, struct bch_inode_unpacked *,
 
 int bch2_inode_create(struct btree_trans *, struct bch_inode_unpacked *);
 
-int bch2_inode_rm(struct bch_fs *, u64);
+int bch2_inode_rm(struct bch_fs *, u64, bool);
 
 int bch2_inode_find_by_inum_trans(struct btree_trans *, u64,
                                  struct bch_inode_unpacked *);