summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-11-15 20:40:28 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2019-11-16 16:35:38 -0500
commit49c8f61ebff8dc5fff68752d22800f7f57a5c24e (patch)
treeae0e1ed4357d9b68c7b6441a108e8334b6fba964
parent75d4c8fd98acca81d7729a33dd7ca7db88ba28d0 (diff)
bcachefs: KEY_TYPE_extent_block_checksumextent-inline-data
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/bcachefs_format.h13
-rw-r--r--fs/bcachefs/bkey.h1
-rw-r--r--fs/bcachefs/extents.c15
-rw-r--r--fs/bcachefs/extents.h22
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);