bcachefs: New blockcount field for bch_stripe
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 25 Nov 2018 00:01:45 +0000 (19:01 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:13 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/ec.c

index 010b9b90f2fcfdd107615931b0770486a2439e07..5a5baba8d79be4f4af554da2d8386028c7a624a5 100644 (file)
@@ -105,22 +105,32 @@ static unsigned stripe_csums_per_device(const struct bch_stripe *s)
                            1 << s->csum_granularity_bits);
 }
 
-static unsigned stripe_val_u64s(const struct bch_stripe *s)
+static unsigned stripe_csum_offset(const struct bch_stripe *s,
+                                  unsigned dev, unsigned csum_idx)
 {
-       unsigned bytes = sizeof(struct bch_stripe) +
+       unsigned csum_bytes = bch_crc_bytes[s->csum_type];
+
+       return sizeof(struct bch_stripe) +
                sizeof(struct bch_extent_ptr) * s->nr_blocks +
-               bch_crc_bytes[s->csum_type] * s->nr_blocks * stripe_csums_per_device(s);
-       return DIV_ROUND_UP(bytes, sizeof(u64));
+               (dev * stripe_csums_per_device(s) + csum_idx) * csum_bytes;
 }
 
-static void *stripe_csum(struct bch_stripe *s, unsigned dev, unsigned csum_idx)
+static unsigned stripe_blockcount_offset(const struct bch_stripe *s,
+                                        unsigned idx)
 {
-       unsigned csum_bytes = bch_crc_bytes[s->csum_type];
-       void *csums = s->ptrs + s->nr_blocks;
+       return stripe_csum_offset(s, s->nr_blocks, 0) +
+               sizeof(16) * idx;
+}
 
-       BUG_ON(!csum_bytes);
+static unsigned stripe_val_u64s(const struct bch_stripe *s)
+{
+       return DIV_ROUND_UP(stripe_blockcount_offset(s, s->nr_blocks),
+                           sizeof(u64));
+}
 
-       return csums + (dev * stripe_csums_per_device(s) + csum_idx) * csum_bytes;
+static void *stripe_csum(struct bch_stripe *s, unsigned dev, unsigned csum_idx)
+{
+       return (void *) s + stripe_csum_offset(s, dev, csum_idx);
 }
 
 const char *bch2_stripe_invalid(const struct bch_fs *c, struct bkey_s_c k)
@@ -133,7 +143,8 @@ const char *bch2_stripe_invalid(const struct bch_fs *c, struct bkey_s_c k)
        if (bkey_val_bytes(k.k) < sizeof(*s))
                return "incorrect value size";
 
-       if (bkey_val_u64s(k.k) != stripe_val_u64s(s))
+       if (bkey_val_bytes(k.k) < sizeof(*s) ||
+           bkey_val_u64s(k.k) < stripe_val_u64s(s))
                return "incorrect value size";
 
        return NULL;