Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
Something went wrong. Try again.
C
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203/* SPDX-License-Identifier: GPL-2.0 */#ifndef _LINUX_BLK_INTEGRITY_H#define _LINUX_BLK_INTEGRITY_H
#include <linux/blk-mq.h>#include <linux/bio-integrity.h>#include <linux/blk-mq-dma.h>
struct request;
enum blk_integrity_flags { BLK_INTEGRITY_NOVERIFY = 1 << 0, BLK_INTEGRITY_NOGENERATE = 1 << 1, BLK_INTEGRITY_DEVICE_CAPABLE = 1 << 2, BLK_INTEGRITY_REF_TAG = 1 << 3, BLK_INTEGRITY_STACKED = 1 << 4, BLK_SPLIT_INTERVAL_CAPABLE = 1 << 5,};
const char *blk_integrity_profile_name(struct blk_integrity *bi);bool queue_limits_stack_integrity(struct queue_limits *t, struct queue_limits *b);static inline bool queue_limits_stack_integrity_bdev(struct queue_limits *t, struct block_device *bdev){ return queue_limits_stack_integrity(t, &bdev->bd_disk->queue->limits);}
#ifdef CONFIG_BLK_DEV_INTEGRITYint blk_rq_map_integrity_sg(struct request *, struct scatterlist *);
int blk_rq_count_integrity_sg(struct request_queue *, struct bio *);int blk_rq_integrity_map_user(struct request *rq, void __user *ubuf, ssize_t bytes);int blk_get_meta_cap(struct block_device *bdev, unsigned int cmd, struct logical_block_metadata_cap __user *argp);bool blk_rq_integrity_dma_map_iter_start(struct request *req, struct device *dma_dev, struct dma_iova_state *state, struct blk_dma_iter *iter);bool blk_rq_integrity_dma_map_iter_next(struct request *req, struct device *dma_dev, struct blk_dma_iter *iter);
static inline boolblk_integrity_queue_supports_integrity(struct request_queue *q){ return q->limits.integrity.metadata_size;}
static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk){ if (!blk_integrity_queue_supports_integrity(disk->queue)) return NULL; return &disk->queue->limits.integrity;}
static inline struct blk_integrity *bdev_get_integrity(struct block_device *bdev){ return blk_get_integrity(bdev->bd_disk);}
static inline unsigned shortqueue_max_integrity_segments(const struct request_queue *q){ return q->limits.max_integrity_segments;}
/** * 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->metadata_size;}
static inline bool blk_integrity_rq(const struct request *rq){ return rq->cmd_flags & REQ_INTEGRITY;}
/* * Return the current bvec that contains the integrity data. bip_iter may be * advanced to iterate over the integrity data. */static inline struct bio_vec rq_integrity_vec(struct request *rq){ return mp_bvec_iter_bvec(rq->bio->bi_integrity->bip_vec, rq->bio->bi_integrity->bip_iter);}#else /* CONFIG_BLK_DEV_INTEGRITY */static inline int blk_get_meta_cap(struct block_device *bdev, unsigned int cmd, struct logical_block_metadata_cap __user *argp){ return -ENOIOCTLCMD;}static inline int blk_rq_count_integrity_sg(struct request_queue *q, struct bio *b){ return 0;}static inline int blk_rq_map_integrity_sg(struct request *q, struct scatterlist *s){ return 0;}static inline int blk_rq_integrity_map_user(struct request *rq, void __user *ubuf, ssize_t bytes){ return -EINVAL;}static inline bool blk_rq_integrity_dma_map_iter_start(struct request *req, struct device *dma_dev, struct dma_iova_state *state, struct blk_dma_iter *iter){ return false;}static inline bool blk_rq_integrity_dma_map_iter_next(struct request *req, struct device *dma_dev, struct blk_dma_iter *iter){ return false;}static inline struct blk_integrity *bdev_get_integrity(struct block_device *b){ return NULL;}static inline struct blk_integrity *blk_get_integrity(struct gendisk *disk){ return NULL;}static inline boolblk_integrity_queue_supports_integrity(struct request_queue *q){ return false;}static inline unsigned shortqueue_max_integrity_segments(const struct request_queue *q){ return 0;}
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;}static inline bool blk_integrity_rq(const struct request *rq){ return false;}
static inline struct bio_vec rq_integrity_vec(struct request *rq){ /* the optimizer will remove all calls to this function */ return (struct bio_vec){ };}#endif /* CONFIG_BLK_DEV_INTEGRITY */
enum bio_integrity_action { BI_ACT_BUFFER = (1u << 0), /* allocate buffer */ BI_ACT_CHECK = (1u << 1), /* generate / verify PI */ BI_ACT_ZERO = (1u << 2), /* zero buffer */};
/** * bio_integrity_action - return the integrity action needed for a bio * @bio: bio to operate on * * Returns the mask of integrity actions (BI_ACT_*) that need to be performed * for @bio. */unsigned int __bio_integrity_action(struct bio *bio);static inline unsigned int bio_integrity_action(struct bio *bio){ if (!blk_get_integrity(bio->bi_bdev->bd_disk)) return 0; if (bio_integrity(bio)) return 0; return __bio_integrity_action(bio);}
#endif /* _LINUX_BLK_INTEGRITY_H */