bcachefs: Fix misaligned bucket check in journal space calculations
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 28 May 2025 02:06:04 +0000 (22:06 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Fri, 30 May 2025 05:21:12 +0000 (01:21 -0400)
Fix an assertion pop in the tiering_misaligned test: rounding down to
bucket size at the end of the journal space calculations leaves
cur_entry_sectors == 0, which is incorrect with !cur_entry_err.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/journal_reclaim.c

index 70f36f6bc4820a775087a843d2fa6eea281d4999..d0604218bf653e81ed2994717fc4427fe179b62e 100644 (file)
@@ -83,18 +83,20 @@ static struct journal_space
 journal_dev_space_available(struct journal *j, struct bch_dev *ca,
                            enum journal_space_from from)
 {
+       struct bch_fs *c = container_of(j, struct bch_fs, journal);
        struct journal_device *ja = &ca->journal;
        unsigned sectors, buckets, unwritten;
+       unsigned bucket_size_aligned = round_down(ca->mi.bucket_size, block_sectors(c));
        u64 seq;
 
        if (from == journal_space_total)
                return (struct journal_space) {
-                       .next_entry     = ca->mi.bucket_size,
-                       .total          = ca->mi.bucket_size * ja->nr,
+                       .next_entry     = bucket_size_aligned,
+                       .total          = bucket_size_aligned * ja->nr,
                };
 
        buckets = bch2_journal_dev_buckets_available(j, ja, from);
-       sectors = ja->sectors_free;
+       sectors = round_down(ja->sectors_free, block_sectors(c));
 
        /*
         * We that we don't allocate the space for a journal entry
@@ -109,7 +111,7 @@ journal_dev_space_available(struct journal *j, struct bch_dev *ca,
                        continue;
 
                /* entry won't fit on this device, skip: */
-               if (unwritten > ca->mi.bucket_size)
+               if (unwritten > bucket_size_aligned)
                        continue;
 
                if (unwritten >= sectors) {
@@ -119,7 +121,7 @@ journal_dev_space_available(struct journal *j, struct bch_dev *ca,
                        }
 
                        buckets--;
-                       sectors = ca->mi.bucket_size;
+                       sectors = bucket_size_aligned;
                }
 
                sectors -= unwritten;
@@ -127,12 +129,12 @@ journal_dev_space_available(struct journal *j, struct bch_dev *ca,
 
        if (sectors < ca->mi.bucket_size && buckets) {
                buckets--;
-               sectors = ca->mi.bucket_size;
+               sectors = bucket_size_aligned;
        }
 
        return (struct journal_space) {
                .next_entry     = sectors,
-               .total          = sectors + buckets * ca->mi.bucket_size,
+               .total          = sectors + buckets * bucket_size_aligned,
        };
 }
 
@@ -256,8 +258,7 @@ void bch2_journal_space_available(struct journal *j)
        bch2_journal_set_watermark(j);
 out:
        j->cur_entry_sectors    = !ret
-               ? round_down(j->space[journal_space_discarded].next_entry,
-                            block_sectors(c))
+               ? j->space[journal_space_discarded].next_entry
                : 0;
        j->cur_entry_error      = ret;