aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/fs/bcachefs/str_hash.h
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2024-12-08 21:47:34 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-12-21 01:36:23 -0500
commit6ea607ca61475f9281191dab9d5f8a61baee1c4f (patch)
tree623dfcd9804eb6c1fca456809c420cdc3d941c6d /fs/bcachefs/str_hash.h
parentbcachefs: Don't BUG_ON() inode unpack error (diff)
downloadwireguard-linux-6ea607ca61475f9281191dab9d5f8a61baee1c4f.tar.xz
wireguard-linux-6ea607ca61475f9281191dab9d5f8a61baee1c4f.zip
bcachefs: bch2_str_hash_check_key() now checks inode hash info
Versions of the same inode in different snapshots must have the same hash info; this is critical for lookups to work correctly. We're going to be running the str_hash checks online, at readdir or xattr list time, so we now need str_hash_check_key() to check for inode hash seed mismatches, since it won't be run right after check_inodes(). Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to '')
-rw-r--r--fs/bcachefs/str_hash.h25
1 files changed, 20 insertions, 5 deletions
diff --git a/fs/bcachefs/str_hash.h b/fs/bcachefs/str_hash.h
index 0c20f3af03f8..55a4ac7bf220 100644
--- a/fs/bcachefs/str_hash.h
+++ b/fs/bcachefs/str_hash.h
@@ -394,10 +394,25 @@ int bch2_hash_delete(struct btree_trans *trans,
}
struct snapshots_seen;
-int bch2_str_hash_check_key(struct btree_trans *,
- struct snapshots_seen *,
- const struct bch_hash_desc,
- struct bch_hash_info *,
- struct btree_iter *, struct bkey_s_c);
+int __bch2_str_hash_check_key(struct btree_trans *,
+ struct snapshots_seen *,
+ const struct bch_hash_desc *,
+ struct bch_hash_info *,
+ struct btree_iter *, struct bkey_s_c);
+
+static inline int bch2_str_hash_check_key(struct btree_trans *trans,
+ struct snapshots_seen *s,
+ const struct bch_hash_desc *desc,
+ struct bch_hash_info *hash_info,
+ struct btree_iter *k_iter, struct bkey_s_c hash_k)
+{
+ if (hash_k.k->type != desc->key_type)
+ return 0;
+
+ if (likely(desc->hash_bkey(hash_info, hash_k) == hash_k.k->p.offset))
+ return 0;
+
+ return __bch2_str_hash_check_key(trans, s, desc, hash_info, k_iter, hash_k);
+}
#endif /* _BCACHEFS_STR_HASH_H */