]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Fix allocating too big journal entry
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 3 Dec 2024 04:36:38 +0000 (23:36 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:21 +0000 (01:36 -0500)
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>
fs/bcachefs/journal_reclaim.c

index 1aabbbe328d9fc9ee84c648b8c7f27a8501496df..b7936ad3ae7f0e37f75e60a69ef58dc6e3d37bd4 100644 (file)
@@ -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)