blk-integrity.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _LINUX_BLK_INTEGRITY_H
  3. #define _LINUX_BLK_INTEGRITY_H
  4. #include <linux/blk-mq.h>
  5. struct request;
  6. enum blk_integrity_flags {
  7. BLK_INTEGRITY_VERIFY = 1 << 0,
  8. BLK_INTEGRITY_GENERATE = 1 << 1,
  9. BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2,
  10. BLK_INTEGRITY_IP_CHECKSUM = 1 << 3,
  11. };
  12. struct blk_integrity_iter {
  13. void *prot_buf;
  14. void *data_buf;
  15. sector_t seed;
  16. unsigned int data_size;
  17. unsigned short interval;
  18. unsigned char tuple_size;
  19. const char *disk_name;
  20. };
  21. typedef blk_status_t (integrity_processing_fn) (struct blk_integrity_iter *);
  22. typedef void (integrity_prepare_fn) (struct request *);
  23. typedef void (integrity_complete_fn) (struct request *, unsigned int);
  24. struct blk_integrity_profile {
  25. integrity_processing_fn *generate_fn;
  26. integrity_processing_fn *verify_fn;
  27. integrity_prepare_fn *prepare_fn;
  28. integrity_complete_fn *complete_fn;
  29. const char *name;
  30. };
  31. #ifdef CONFIG_BLK_DEV_INTEGRITY
  32. void blk_integrity_register(struct gendisk *, struct blk_integrity *);
  33. void blk_integrity_unregister(struct gendisk *);
  34. int blk_integrity_compare(struct gendisk *, struct gendisk *);
  35. int blk_rq_map_integrity_sg(struct request_queue *, struct bio *,
  36. struct scatterlist *);
  37. int blk_rq_count_integrity_sg(struct request_queue *, struct bio *);
  38. static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
  39. {
  40. struct blk_integrity *bi = &disk->queue->integrity;
  41. if (!bi->profile)
  42. return NULL;
  43. return bi;
  44. }
  45. static inline struct blk_integrity *
  46. bdev_get_integrity(struct block_device *bdev)
  47. {
  48. return blk_get_integrity(bdev->bd_disk);
  49. }
  50. static inline bool
  51. blk_integrity_queue_supports_integrity(struct request_queue *q)
  52. {
  53. return q->integrity.profile;
  54. }
  55. static inline void blk_queue_max_integrity_segments(struct request_queue *q,
  56. unsigned int segs)
  57. {
  58. q->limits.max_integrity_segments = segs;
  59. }
  60. static inline unsigned short
  61. queue_max_integrity_segments(const struct request_queue *q)
  62. {
  63. return q->limits.max_integrity_segments;
  64. }
  65. /**
  66. * bio_integrity_intervals - Return number of integrity intervals for a bio
  67. * @bi: blk_integrity profile for device
  68. * @sectors: Size of the bio in 512-byte sectors
  69. *
  70. * Description: The block layer calculates everything in 512 byte
  71. * sectors but integrity metadata is done in terms of the data integrity
  72. * interval size of the storage device. Convert the block layer sectors
  73. * to the appropriate number of integrity intervals.
  74. */
  75. static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi,
  76. unsigned int sectors)
  77. {
  78. return sectors >> (bi->interval_exp - 9);
  79. }
  80. static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
  81. unsigned int sectors)
  82. {
  83. return bio_integrity_intervals(bi, sectors) * bi->tuple_size;
  84. }
  85. static inline bool blk_integrity_rq(struct request *rq)
  86. {
  87. return rq->cmd_flags & REQ_INTEGRITY;
  88. }
  89. /*
  90. * Return the first bvec that contains integrity data. Only drivers that are
  91. * limited to a single integrity segment should use this helper.
  92. */
  93. static inline struct bio_vec *rq_integrity_vec(struct request *rq)
  94. {
  95. if (WARN_ON_ONCE(queue_max_integrity_segments(rq->q) > 1))
  96. return NULL;
  97. return rq->bio->bi_integrity->bip_vec;
  98. }
  99. #else /* CONFIG_BLK_DEV_INTEGRITY */
  100. static inline int blk_rq_count_integrity_sg(struct request_queue *q,
  101. struct bio *b)
  102. {
  103. return 0;
  104. }
  105. static inline int blk_rq_map_integrity_sg(struct request_queue *q,
  106. struct bio *b,
  107. struct scatterlist *s)
  108. {
  109. return 0;
  110. }
  111. static inline struct blk_integrity *bdev_get_integrity(struct block_device *b)
  112. {
  113. return NULL;
  114. }
  115. static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk)
  116. {
  117. return NULL;
  118. }
  119. static inline bool
  120. blk_integrity_queue_supports_integrity(struct request_queue *q)
  121. {
  122. return false;
  123. }
  124. static inline int blk_integrity_compare(struct gendisk *a, struct gendisk *b)
  125. {
  126. return 0;
  127. }
  128. static inline void blk_integrity_register(struct gendisk *d,
  129. struct blk_integrity *b)
  130. {
  131. }
  132. static inline void blk_integrity_unregister(struct gendisk *d)
  133. {
  134. }
  135. static inline void blk_queue_max_integrity_segments(struct request_queue *q,
  136. unsigned int segs)
  137. {
  138. }
  139. static inline unsigned short
  140. queue_max_integrity_segments(const struct request_queue *q)
  141. {
  142. return 0;
  143. }
  144. static inline unsigned int bio_integrity_intervals(struct blk_integrity *bi,
  145. unsigned int sectors)
  146. {
  147. return 0;
  148. }
  149. static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
  150. unsigned int sectors)
  151. {
  152. return 0;
  153. }
  154. static inline int blk_integrity_rq(struct request *rq)
  155. {
  156. return 0;
  157. }
  158. static inline struct bio_vec *rq_integrity_vec(struct request *rq)
  159. {
  160. return NULL;
  161. }
  162. #endif /* CONFIG_BLK_DEV_INTEGRITY */
  163. #endif /* _LINUX_BLK_INTEGRITY_H */