mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
bcachefs: Fix allocating too big journal entry
The "journal space available" calculations didn't take into account mismatched bucket sizes; we need to take the minimum space available out of our devices. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
5cdaec193a
commit
9c22dd02ae
|
|
@ -140,6 +140,7 @@ static struct journal_space __journal_space_available(struct journal *j, unsigne
|
|||
struct bch_fs *c = container_of(j, struct bch_fs, journal);
|
||||
unsigned pos, nr_devs = 0;
|
||||
struct journal_space space, dev_space[BCH_SB_MEMBERS_MAX];
|
||||
unsigned min_bucket_size = U32_MAX;
|
||||
|
||||
BUG_ON(nr_devs_want > ARRAY_SIZE(dev_space));
|
||||
|
||||
|
|
@ -148,6 +149,8 @@ static struct journal_space __journal_space_available(struct journal *j, unsigne
|
|||
if (!ca->journal.nr)
|
||||
continue;
|
||||
|
||||
min_bucket_size = min(min_bucket_size, ca->mi.bucket_size);
|
||||
|
||||
space = journal_dev_space_available(j, ca, from);
|
||||
if (!space.next_entry)
|
||||
continue;
|
||||
|
|
@ -167,7 +170,9 @@ static struct journal_space __journal_space_available(struct journal *j, unsigne
|
|||
* We sorted largest to smallest, and we want the smallest out of the
|
||||
* @nr_devs_want largest devices:
|
||||
*/
|
||||
return dev_space[nr_devs_want - 1];
|
||||
space = dev_space[nr_devs_want - 1];
|
||||
space.next_entry = min(space.next_entry, min_bucket_size);
|
||||
return space;
|
||||
}
|
||||
|
||||
void bch2_journal_space_available(struct journal *j)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user