diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2023-12-12 20:30:44 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-12-21 23:47:50 -0500 |
commit | 395caf6174ae14c0d4e264813b75cd85abe652cc (patch) | |
tree | 95e08ad94cc9594ef9c1e006522e1667c7031a86 | |
parent | 66433753f13b4e0a127ef8ea5287b9b57ec717a4 (diff) |
bcachefs: trans->updates will also be resizable
the reflink triggers are also bumping up against the maximum number of
paths in a transaction - and generating proportional numbers of updates.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/btree_iter.c | 3 | ||||
-rw-r--r-- | fs/bcachefs/btree_types.h | 4 | ||||
-rw-r--r-- | fs/bcachefs/btree_update.c | 2 |
3 files changed, 5 insertions, 4 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index bf049d7eb0f2..6d5088b4d859 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -2879,7 +2879,7 @@ struct btree_trans *__bch2_trans_get(struct bch_fs *c, unsigned fn_idx) if (IS_ENABLED(__KERNEL__)) { trans = this_cpu_xchg(c->btree_trans_bufs->trans, NULL); if (trans) { - memset(trans, 0, offsetof(struct btree_trans, updates)); + memset(trans, 0, offsetof(struct btree_trans, list)); goto got_trans; } } @@ -2927,6 +2927,7 @@ got_trans: trans->paths_allocated = trans->_paths_allocated; trans->sorted = trans->_sorted; trans->paths = trans->_paths; + trans->updates = trans->_updates; *trans_paths_nr(trans->paths) = BTREE_ITER_MAX; diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index 3baf688177c4..81f54a2c4e81 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -383,6 +383,7 @@ struct btree_trans { unsigned long *paths_allocated; struct btree_path *paths; u8 *sorted; + struct btree_insert_entry *updates; void *mem; unsigned mem_top; @@ -433,8 +434,6 @@ struct btree_trans { /* Entries before this are zeroed out on every bch2_trans_get() call */ - struct btree_insert_entry updates[BTREE_ITER_MAX]; - struct list_head list; struct closure ref; @@ -442,6 +441,7 @@ struct btree_trans { 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]; }; static inline struct btree_path *btree_iter_path(struct btree_trans *trans, struct btree_iter *iter) diff --git a/fs/bcachefs/btree_update.c b/fs/bcachefs/btree_update.c index 8ce1c3d61137..a577cfe1bfa8 100644 --- a/fs/bcachefs/btree_update.c +++ b/fs/bcachefs/btree_update.c @@ -386,7 +386,7 @@ bch2_trans_update_by_path(struct btree_trans *trans, btree_path_idx_t path_idx, struct btree_path *path = trans->paths + path_idx; EBUG_ON(!path->should_be_locked); - EBUG_ON(trans->nr_updates >= ARRAY_SIZE(trans->updates)); + EBUG_ON(trans->nr_updates >= BTREE_ITER_MAX); EBUG_ON(!bpos_eq(k->k.p, path->pos)); n = (struct btree_insert_entry) { |