diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-11-24 19:01:45 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:13 -0400 |
commit | 76640280ac45e2d56f5bf7c519b10653b9361fcd (patch) | |
tree | fe0539495510040a7a27f03584dfe848f763c441 /fs/bcachefs/ec.c | |
parent | 8eb7f3ee46f23207d3e0ae6428b780a0708c53c1 (diff) | |
download | lwn-76640280ac45e2d56f5bf7c519b10653b9361fcd.tar.gz lwn-76640280ac45e2d56f5bf7c519b10653b9361fcd.zip |
bcachefs: New blockcount field for bch_stripe
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/ec.c')
-rw-r--r-- | fs/bcachefs/ec.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/fs/bcachefs/ec.c b/fs/bcachefs/ec.c index 010b9b90f2fc..5a5baba8d79b 100644 --- a/fs/bcachefs/ec.c +++ b/fs/bcachefs/ec.c @@ -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; |