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_iter.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_iter.h')
-rw-r--r-- | fs/bcachefs/btree_iter.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index 5ee118d3eaa5..0fab4952f9f7 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -63,6 +63,22 @@ static inline void btree_trans_sort_paths(struct btree_trans *trans) __bch2_btree_trans_sort_paths(trans); } +static inline unsigned long *trans_paths_nr(struct btree_path *paths) +{ + return &container_of(paths, struct btree_trans_paths, paths[0])->nr_paths; +} + +static inline unsigned long *trans_paths_allocated(struct btree_path *paths) +{ + unsigned long *v = trans_paths_nr(paths); + return v - BITS_TO_LONGS(*v); +} + +#define trans_for_each_path_idx_from(_paths_allocated, _nr, _idx, _start)\ + for (_idx = _start; \ + (_idx = find_next_bit(_paths_allocated, _nr, _idx)) < _nr; \ + _idx++) + static inline struct btree_path * __trans_next_path(struct btree_trans *trans, unsigned *idx) { |