diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-11-15 20:40:28 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-11-16 16:35:38 -0500 |
commit | 49c8f61ebff8dc5fff68752d22800f7f57a5c24e (patch) | |
tree | ae0e1ed4357d9b68c7b6441a108e8334b6fba964 /fs | |
parent | 75d4c8fd98acca81d7729a33dd7ca7db88ba28d0 (diff) |
bcachefs: KEY_TYPE_extent_block_checksumextent-inline-data
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bcachefs/bcachefs_format.h | 13 | ||||
-rw-r--r-- | fs/bcachefs/bkey.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/extents.c | 15 | ||||
-rw-r--r-- | fs/bcachefs/extents.h | 22 |
4 files changed, 50 insertions, 1 deletions
diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h index 5c3dd7e2ddd8..2593703e0518 100644 --- a/fs/bcachefs/bcachefs_format.h +++ b/fs/bcachefs/bcachefs_format.h @@ -339,7 +339,8 @@ static inline void bkey_init(struct bkey *k) x(stripe, 14) \ x(reflink_p, 15) \ x(reflink_v, 16) \ - x(inline_data, 17) + x(inline_data, 17) \ + x(extent_block_checksum, 18) enum bch_bkey_type { #define x(name, nr) KEY_TYPE_##name = nr, @@ -643,6 +644,16 @@ struct bch_extent { __u64 _data[0]; } __attribute__((packed, aligned(8))); +struct bch_extent_block_checksum { + struct bch_val v; + __u8 csum_type; + __u8 csum_granularity_bits; + __u8 csum_u64s; + __u8 pad[5]; + + __u64 _data[0]; +}; + struct bch_reservation { struct bch_val v; diff --git a/fs/bcachefs/bkey.h b/fs/bcachefs/bkey.h index f2d5f3009b21..562a1b728db9 100644 --- a/fs/bcachefs/bkey.h +++ b/fs/bcachefs/bkey.h @@ -565,6 +565,7 @@ BKEY_VAL_ACCESSORS(stripe); BKEY_VAL_ACCESSORS(reflink_p); BKEY_VAL_ACCESSORS(reflink_v); BKEY_VAL_ACCESSORS(inline_data); +BKEY_VAL_ACCESSORS(extent_block_checksum); /* byte order helpers */ diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c index a3c2b7566aa2..c7ee759452cd 100644 --- a/fs/bcachefs/extents.c +++ b/fs/bcachefs/extents.c @@ -582,6 +582,21 @@ enum merge_result bch2_extent_merge(struct bch_fs *c, return BCH_MERGE_MERGE; } +/* KEY_TYPE_extent_block_checksum */ + +const char *bch2_extent_block_checksum_invalid(const struct bch_fs *c, struct bkey_s_c k) +{ + /* XXX check other fields */ + + return bch2_bkey_ptrs_invalid(c, k); +} + +void bch2_extent_block_checksum_to_text(struct printbuf *out, struct bch_fs *c, + struct bkey_s_c k) +{ + bch2_bkey_ptrs_to_text(out, c, k); +} + /* KEY_TYPE_reservation: */ const char *bch2_reservation_invalid(const struct bch_fs *c, struct bkey_s_c k) diff --git a/fs/bcachefs/extents.h b/fs/bcachefs/extents.h index ef2849e8b1f2..f2ef4da4c434 100644 --- a/fs/bcachefs/extents.h +++ b/fs/bcachefs/extents.h @@ -315,6 +315,15 @@ static inline struct bkey_ptrs_c bch2_bkey_ptrs_c(struct bkey_s_c k) bkey_val_end(r), }; } + case KEY_TYPE_extent_block_checksum: { + struct bkey_s_c_extent_block_checksum e = + bkey_s_c_to_extent_block_checksum(k); + + return (struct bkey_ptrs_c) { + (void *) (e.v->_data + e.v->csum_u64s), + bkey_val_end(e), + }; + } default: return (struct bkey_ptrs_c) { NULL, NULL }; } @@ -420,6 +429,19 @@ enum merge_result bch2_extent_merge(struct bch_fs *, .key_merge = bch2_extent_merge, \ } +/* KEY_TYPE_extent_block_checksum */ + +const char *bch2_extent_block_checksum_invalid(const struct bch_fs *, + struct bkey_s_c); +void bch2_extent_block_checksum_to_text(struct printbuf *, struct bch_fs *, + struct bkey_s_c); + +#define bch2_bkey_ops_extent_block_checksum (struct bkey_ops) { \ + .key_invalid = bch2_extent_block_checksum_invalid, \ + .val_to_text = bch2_extent_block_checksum_to_text, \ + .key_normalize = bch2_extent_normalize, \ +} + /* KEY_TYPE_reservation: */ const char *bch2_reservation_invalid(const struct bch_fs *, struct bkey_s_c); |