|
@@ -1865,6 +1865,28 @@ static inline bool integrity_req_gap_front_merge(struct request *req,
|
|
|
bip_next->bip_vec[0].bv_offset);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * bio_integrity_intervals - Return number of integrity intervals for a bio
|
|
|
+ * @bi: blk_integrity profile for device
|
|
|
+ * @sectors: Size of the bio in 512-byte sectors
|
|
|
+ *
|
|
|
+ * Description: The block layer calculates everything in 512 byte
|
|
|
+ * sectors but integrity metadata is done in terms of the data integrity
|
|
|
+ * interval size of the storage device. Convert the block layer sectors
|
|
|
+ * to the appropriate number of integrity intervals.
|
|
|
+ */
|
|
|
+static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi,
|
|
|
+ unsigned int sectors)
|
|
|
+{
|
|
|
+ return sectors >> (bi->interval_exp - 9);
|
|
|
+}
|
|
|
+
|
|
|
+static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
|
|
|
+ unsigned int sectors)
|
|
|
+{
|
|
|
+ return bio_integrity_intervals(bi, sectors) * bi->tuple_size;
|
|
|
+}
|
|
|
+
|
|
|
#else /* CONFIG_BLK_DEV_INTEGRITY */
|
|
|
|
|
|
struct bio;
|
|
@@ -1938,6 +1960,18 @@ static inline bool integrity_req_gap_front_merge(struct request *req,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi,
|
|
|
+ unsigned int sectors)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
|
|
|
+ unsigned int sectors)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
#endif /* CONFIG_BLK_DEV_INTEGRITY */
|
|
|
|
|
|
struct block_device_operations {
|