summaryrefslogtreecommitdiffstats
path: root/fs/bcachefs/btree_types.h
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-12-10 19:26:30 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-01-01 11:47:44 -0500
commit0c99e17d3bd3b60ee7461cb8e87ff6badf228422 (patch)
tree6c8f7f8b7ad1f6bee380eb90cd2e57f099078fe3 /fs/bcachefs/btree_types.h
parentff70ad2c8dfdcc24f98b645481116d4c2ea20e37 (diff)
downloadlinux-0c99e17d3bd3b60ee7461cb8e87ff6badf228422.tar.gz
linux-0c99e17d3bd3b60ee7461cb8e87ff6badf228422.tar.bz2
linux-0c99e17d3bd3b60ee7461cb8e87ff6badf228422.zip
bcachefs: growable btree_paths
XXX: we're allocating memory with btree locks held - bad We need to plumb through an error path so we can do allocate_dropping_locks() - but we're merging this now because it fixes a transaction path overflow caused by indirect extent fragmentation, and the resize path is rare. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/btree_types.h')
-rw-r--r--fs/bcachefs/btree_types.h13
1 files changed, 7 insertions, 6 deletions
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index e4ebfc25df8e..d530307046f4 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -358,7 +358,8 @@ struct btree_insert_entry {
unsigned long ip_allocated;
};
-#define BTREE_ITER_MAX 64
+#define BTREE_ITER_INITIAL 64
+#define BTREE_ITER_MAX (1U << 10)
struct btree_trans_commit_hook;
typedef int (btree_trans_commit_hook_fn)(struct btree_trans *, struct btree_trans_commit_hook *);
@@ -382,7 +383,7 @@ struct btree_trans {
unsigned long *paths_allocated;
struct btree_path *paths;
- u8 *sorted;
+ btree_path_idx_t *sorted;
struct btree_insert_entry *updates;
void *mem;
@@ -438,11 +439,11 @@ struct btree_trans {
struct list_head list;
struct closure ref;
- unsigned long _paths_allocated[BITS_TO_LONGS(BTREE_ITER_MAX)];
+ unsigned long _paths_allocated[BITS_TO_LONGS(BTREE_ITER_INITIAL)];
struct btree_trans_paths trans_paths;
- struct btree_path _paths[BTREE_ITER_MAX];
- u8 _sorted[BTREE_ITER_MAX + 8];
- struct btree_insert_entry _updates[BTREE_ITER_MAX];
+ struct btree_path _paths[BTREE_ITER_INITIAL];
+ btree_path_idx_t _sorted[BTREE_ITER_INITIAL + 4];
+ struct btree_insert_entry _updates[BTREE_ITER_INITIAL];
};
static inline struct btree_path *btree_iter_path(struct btree_trans *trans, struct btree_iter *iter)