summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_types.h
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-12-12 20:08:29 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-01-01 11:47:44 -0500
commitfea153a84557c982542527143950dbef434731c2 (patch)
tree7fc53a84018c9d7ed237cfcd9e342da3cbd1d25f /fs/bcachefs/btree_types.h
parent6474b706108bac9e531a71ddeb8150f8fa17163c (diff)
bcachefs: rcu protect trans->paths
Upcoming patches are going to be changing trans->paths to a reallocatable buffer. We need to guard against use after free when it's used by other threads; this introduces RCU protection to those paths and changes them to check for trans->paths == NULL Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/btree_types.h')
-rw-r--r--fs/bcachefs/btree_types.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index c1baece14120..28bac4ce20e1 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -372,12 +372,17 @@ struct btree_trans_commit_hook {
#define BTREE_TRANS_MAX_LOCK_HOLD_TIME_NS 10000
+struct btree_trans_paths {
+ unsigned long nr_paths;
+ struct btree_path paths[];
+};
+
struct btree_trans {
struct bch_fs *c;
unsigned long *paths_allocated;
- u8 *sorted;
struct btree_path *paths;
+ u8 *sorted;
void *mem;
unsigned mem_top;
@@ -431,8 +436,9 @@ struct btree_trans {
struct replicas_delta_list *fs_usage_deltas;
unsigned long _paths_allocated[BITS_TO_LONGS(BTREE_ITER_MAX)];
- u8 _sorted[BTREE_ITER_MAX + 8];
+ struct btree_trans_paths trans_paths;
struct btree_path _paths[BTREE_ITER_MAX];
+ u8 _sorted[BTREE_ITER_MAX + 8];
};
static inline struct btree_path *btree_iter_path(struct btree_trans *trans, struct btree_iter *iter)