/** * blk_rq_count_integrity_sg - Count number of integrity scatterlist elements * @q: request queue * @bio: bio with integrity metadata attached * * Description: Returns the number of elements required in a * scatterlist corresponding to the integrity metadata in a bio.
*/ int blk_rq_count_integrity_sg(struct request_queue *q, struct bio *bio)
{ struct bio_vec iv, ivprv = { NULL }; unsignedint segments = 0; unsignedint seg_size = 0; struct bvec_iter iter; int prev = 0;
bio_for_each_integrity_vec(iv, bio, iter) {
if (prev) { if (!biovec_phys_mergeable(q, &ivprv, &iv)) goto new_segment; if (seg_size + iv.bv_len > queue_max_segment_size(q)) goto new_segment;
/** * blk_rq_map_integrity_sg - Map integrity metadata into a scatterlist * @rq: request to map * @sglist: target scatterlist * * Description: Map the integrity vectors in request into a * scatterlist. The scatterlist must be big enough to hold all * elements. I.e. sized using blk_rq_count_integrity_sg() or * rq->nr_integrity_segments.
*/ int blk_rq_map_integrity_sg(struct request *rq, struct scatterlist *sglist)
{ struct bio_vec iv, ivprv = { NULL }; struct request_queue *q = rq->q; struct scatterlist *sg = NULL; struct bio *bio = rq->bio; unsignedint segments = 0; struct bvec_iter iter; int prev = 0;
bio_for_each_integrity_vec(iv, bio, iter) { if (prev) { if (!biovec_phys_mergeable(q, &ivprv, &iv)) goto new_segment; if (sg->length + iv.bv_len > queue_max_segment_size(q)) goto new_segment;
/* * Something must have been wrong if the figured number of segment * is bigger than number of req's physical integrity segments
*/
BUG_ON(segments > rq->nr_integrity_segments);
BUG_ON(segments > queue_max_integrity_segments(q)); return segments;
}
EXPORT_SYMBOL(blk_rq_map_integrity_sg);
int blk_rq_integrity_map_user(struct request *rq, void __user *ubuf,
ssize_t bytes)
{ int ret; struct iov_iter iter;
iov_iter_ubuf(&iter, rq_data_dir(rq), ubuf, bytes);
ret = bio_integrity_map_user(rq->bio, &iter); if (ret) return ret;
err = kstrtoul(page, 10, &val); if (err) return err;
/* note that the flags are inverted vs the values in the sysfs files */
lim = queue_limits_start_update(q); if (val)
lim.integrity.flags &= ~flag; else
lim.integrity.flags |= flag;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.