diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-12-13 04:08:29 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2024-01-01 19:47:44 +0300 |
commit | fea153a84557c982542527143950dbef434731c2 (patch) | |
tree | 7fc53a84018c9d7ed237cfcd9e342da3cbd1d25f /fs/bcachefs/btree_types.h | |
parent | 6474b706108bac9e531a71ddeb8150f8fa17163c (diff) | |
download | linux-fea153a84557c982542527143950dbef434731c2.tar.xz |
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.h | 10 |
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) |