27 #include <linux/export.h>
28 #include <linux/slab.h>
34 static const char *bi_unsupported_name =
"unsupported";
46 struct bio_vec *
iv, *ivprv =
NULL;
47 unsigned int segments = 0;
48 unsigned int seg_size = 0;
51 bio_for_each_integrity_vec(iv, bio, i) {
54 if (!BIOVEC_PHYS_MERGEABLE(ivprv, iv))
57 if (!BIOVEC_SEG_BOUNDARY(q, ivprv, iv))
60 if (seg_size + iv->bv_len > queue_max_segment_size(q))
63 seg_size += iv->bv_len;
67 seg_size = iv->bv_len;
90 struct bio_vec *
iv, *ivprv =
NULL;
92 unsigned int segments = 0;
95 bio_for_each_integrity_vec(iv, bio, i) {
98 if (!BIOVEC_PHYS_MERGEABLE(ivprv, iv))
101 if (!BIOVEC_SEG_BOUNDARY(q, ivprv, iv))
104 if (sg->
length + iv->bv_len > queue_max_segment_size(q))
117 sg_set_page(sg, iv->bv_page, iv->bv_len, iv->bv_offset);
144 struct blk_integrity *b1 = gd1->integrity;
145 struct blk_integrity *b2 = gd2->integrity;
153 if (b1->sector_size != b2->sector_size) {
155 gd1->disk_name, gd2->disk_name,
156 b1->sector_size, b2->sector_size);
160 if (b1->tuple_size != b2->tuple_size) {
162 gd1->disk_name, gd2->disk_name,
163 b1->tuple_size, b2->tuple_size);
167 if (b1->tag_size && b2->tag_size && (b1->tag_size != b2->tag_size)) {
169 gd1->disk_name, gd2->disk_name,
170 b1->tag_size, b2->tag_size);
174 if (
strcmp(b1->name, b2->name)) {
176 gd1->disk_name, gd2->disk_name,
188 if (blk_integrity_rq(req) != blk_integrity_rq(next))
191 if (req->nr_integrity_segments + next->nr_integrity_segments >
192 q->limits.max_integrity_segments)
202 int nr_integrity_segs;
203 struct bio *
next = bio->bi_next;
209 if (req->nr_integrity_segments + nr_integrity_segs >
210 q->limits.max_integrity_segments)
213 req->nr_integrity_segments += nr_integrity_segs;
228 struct blk_integrity *
bi =
233 return entry->
show(bi, page);
240 struct blk_integrity *
bi =
247 ret = entry->
store(bi, page, count);
252 static ssize_t integrity_format_show(
struct blk_integrity *bi,
char *page)
255 return sprintf(page,
"%s\n", bi->name);
257 return sprintf(page,
"none\n");
260 static ssize_t integrity_tag_size_show(
struct blk_integrity *bi,
char *page)
263 return sprintf(page,
"%u\n", bi->tag_size);
268 static ssize_t integrity_read_store(
struct blk_integrity *bi,
269 const char *page,
size_t count)
271 char *
p = (
char *) page;
275 bi->flags |= INTEGRITY_FLAG_READ;
277 bi->flags &= ~INTEGRITY_FLAG_READ;
282 static ssize_t integrity_read_show(
struct blk_integrity *bi,
char *page)
284 return sprintf(page,
"%d\n", (bi->flags & INTEGRITY_FLAG_READ) != 0);
287 static ssize_t integrity_write_store(
struct blk_integrity *bi,
288 const char *page,
size_t count)
290 char *p = (
char *) page;
294 bi->flags |= INTEGRITY_FLAG_WRITE;
296 bi->flags &= ~INTEGRITY_FLAG_WRITE;
301 static ssize_t integrity_write_show(
struct blk_integrity *bi,
char *page)
303 return sprintf(page,
"%d\n", (bi->flags & INTEGRITY_FLAG_WRITE) != 0);
307 .attr = { .name =
"format", .mode =
S_IRUGO },
308 .show = integrity_format_show,
312 .attr = { .name =
"tag_size", .mode =
S_IRUGO },
313 .show = integrity_tag_size_show,
318 .show = integrity_read_show,
319 .store = integrity_read_store,
324 .show = integrity_write_show,
325 .store = integrity_write_store,
328 static struct attribute *integrity_attrs[] = {
329 &integrity_format_entry.
attr,
330 &integrity_tag_size_entry.
attr,
331 &integrity_read_entry.
attr,
332 &integrity_write_entry.
attr,
336 static const struct sysfs_ops integrity_ops = {
337 .show = &integrity_attr_show,
338 .store = &integrity_attr_store,
341 static int __init blk_dev_integrity_init(
void)
344 sizeof(
struct blk_integrity),
350 static void blk_integrity_release(
struct kobject *kobj)
352 struct blk_integrity *bi =
358 static struct kobj_type integrity_ktype = {
359 .default_attrs = integrity_attrs,
360 .sysfs_ops = &integrity_ops,
361 .release = blk_integrity_release,
366 struct blk_integrity *bi = blk_get_integrity(disk);
368 return (bi && bi->name &&
strcmp(bi->name, bi_unsupported_name) != 0);
386 struct blk_integrity *
bi;
390 if (disk->integrity ==
NULL) {
397 &disk_to_dev(disk)->kobj,
398 "%s",
"integrity")) {
405 bi->flags |= INTEGRITY_FLAG_READ | INTEGRITY_FLAG_WRITE;
406 bi->sector_size = queue_logical_block_size(disk->queue);
407 disk->integrity =
bi;
409 bi = disk->integrity;
412 if (
template !=
NULL) {
413 bi->name =
template->name;
414 bi->generate_fn =
template->generate_fn;
415 bi->verify_fn =
template->verify_fn;
416 bi->tuple_size =
template->tuple_size;
417 bi->set_tag_fn =
template->set_tag_fn;
418 bi->get_tag_fn =
template->get_tag_fn;
419 bi->tag_size =
template->tag_size;
421 bi->name = bi_unsupported_name;
436 struct blk_integrity *
bi;
438 if (!disk || !disk->integrity)
441 bi = disk->integrity;
446 disk->integrity =
NULL;