bcachefs: Fix an overflow check
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 20 Sep 2023 02:18:39 +0000 (22:18 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:14 +0000 (17:10 -0400)
When bucket sector counts were changed from u16s to u32s, a few things
were missed. This fixes an overflow check, and a truncation that
prevented the overflow check from firing.

Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/buckets.c

index 994129142d398baf3ff3b172073c727c2ec260e0..e7f4506f69ca4c371ec6ca1ce2c26f5d7d6540b2 100644 (file)
@@ -680,7 +680,7 @@ static int check_bucket_ref(struct btree_trans *trans,
        struct bch_fs *c = trans->c;
        struct bch_dev *ca = bch_dev_bkey_exists(c, ptr->dev);
        size_t bucket_nr = PTR_BUCKET_NR(ca, ptr);
-       u16 bucket_sectors = !ptr->cached
+       u32 bucket_sectors = !ptr->cached
                ? dirty_sectors
                : cached_sectors;
        struct printbuf buf = PRINTBUF;
@@ -752,9 +752,9 @@ static int check_bucket_ref(struct btree_trans *trans,
                goto err;
        }
 
-       if ((unsigned) (bucket_sectors + sectors) > U32_MAX) {
+       if ((u64) bucket_sectors + sectors > U32_MAX) {
                bch2_fsck_err(c, FSCK_CAN_IGNORE|FSCK_NEED_FSCK,
-                       "bucket %u:%zu gen %u data type %s sector count overflow: %u + %lli > U16_MAX\n"
+                       "bucket %u:%zu gen %u data type %s sector count overflow: %u + %lli > U32_MAX\n"
                        "while marking %s",
                        ptr->dev, bucket_nr, b_gen,
                        bch2_data_types[bucket_data_type ?: ptr_data_type],