17ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/*
27ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio-integrity.c - bio data integrity extensions
37ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
47878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * Copyright (C) 2007, 2008, 2009 Oracle Corporation
57ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Written by: Martin K. Petersen <martin.petersen@oracle.com>
67ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
77ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * This program is free software; you can redistribute it and/or
87ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * modify it under the terms of the GNU General Public License version
97ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * 2 as published by the Free Software Foundation.
107ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
117ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * This program is distributed in the hope that it will be useful, but
127ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * WITHOUT ANY WARRANTY; without even the implied warranty of
137ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
147ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * General Public License for more details.
157ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
167ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * You should have received a copy of the GNU General Public License
177ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * along with this program; see the file COPYING.  If not, write to
187ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139,
197ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * USA.
207ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
217ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
227ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
237ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen#include <linux/blkdev.h>
247ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen#include <linux/mempool.h>
25afeacc8c1f38b7bb93d4bc7b4ba04c2605061ef0Paul Gortmaker#include <linux/export.h>
267ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen#include <linux/bio.h>
277ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen#include <linux/workqueue.h>
285a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
297ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
307878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenstruct integrity_slab {
317878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	struct kmem_cache *slab;
327878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	unsigned short nr_vecs;
337878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	char name[8];
347878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen};
357878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
367878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen#define IS(x) { .nr_vecs = x, .name = "bip-"__stringify(x) }
377878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenstruct integrity_slab bip_slab[BIOVEC_NR_POOLS] __read_mostly = {
387878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	IS(1), IS(4), IS(16), IS(64), IS(128), IS(BIO_MAX_PAGES),
397878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen};
407878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen#undef IS
417878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
427ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenstatic struct workqueue_struct *kintegrityd_wq;
437ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
447878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenstatic inline unsigned int vecs_to_idx(unsigned int nr)
457878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen{
467878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	switch (nr) {
477878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	case 1:
487878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		return 0;
497878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	case 2 ... 4:
507878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		return 1;
517878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	case 5 ... 16:
527878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		return 2;
537878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	case 17 ... 64:
547878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		return 3;
557878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	case 65 ... 128:
567878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		return 4;
577878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	case 129 ... BIO_MAX_PAGES:
587878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		return 5;
597878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	default:
607878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		BUG();
617878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	}
627878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen}
637878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
647878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenstatic inline int use_bip_pool(unsigned int idx)
657878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen{
669e9432c267e4047db98b9d4fba95099c6effcef9Chuck Ebbert	if (idx == BIOVEC_MAX_IDX)
677878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		return 1;
687878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
697878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	return 0;
707878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen}
717878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
727ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
737878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * bio_integrity_alloc_bioset - Allocate integrity payload and attach it to bio
747ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio to attach integrity metadata to
757ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @gfp_mask:	Memory allocation mask
767ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @nr_vecs:	Number of integrity metadata scatter-gather elements
777878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * @bs:		bio_set to allocate from
787ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
797ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: This function prepares a bio for attaching integrity
807ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * metadata.  nr_vecs specifies the maximum number of pages containing
817ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * integrity metadata that can be attached.
827ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
837878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenstruct bio_integrity_payload *bio_integrity_alloc_bioset(struct bio *bio,
847878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen							 gfp_t gfp_mask,
857878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen							 unsigned int nr_vecs,
867878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen							 struct bio_set *bs)
877ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
887ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip;
897878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	unsigned int idx = vecs_to_idx(nr_vecs);
907ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
917ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bio == NULL);
927878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	bip = NULL;
937ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
947878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	/* Lower order allocations come straight from slab */
957878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	if (!use_bip_pool(idx))
967878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		bip = kmem_cache_alloc(bip_slab[idx].slab, gfp_mask);
977ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
987878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	/* Use mempool if lower order alloc failed or max vecs were requested */
997878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	if (bip == NULL) {
1009e9432c267e4047db98b9d4fba95099c6effcef9Chuck Ebbert		idx = BIOVEC_MAX_IDX;  /* so we free the payload properly later */
1017878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		bip = mempool_alloc(bs->bio_integrity_pool, gfp_mask);
1027ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1037878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		if (unlikely(bip == NULL)) {
1047878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen			printk(KERN_ERR "%s: could not alloc bip\n", __func__);
1057878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen			return NULL;
1067878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		}
1077ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
1087ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1097878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	memset(bip, 0, sizeof(*bip));
1107878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
1117878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	bip->bip_slab = idx;
1127ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip->bip_bio = bio;
1137ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bio->bi_integrity = bip;
1147ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1157ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return bip;
1167ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
1177878cba9f0037f5599004b03a1260b32d9050360Martin K. PetersenEXPORT_SYMBOL(bio_integrity_alloc_bioset);
1187878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
1197878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen/**
1207878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * bio_integrity_alloc - Allocate integrity payload and attach it to bio
1217878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * @bio:	bio to attach integrity metadata to
1227878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * @gfp_mask:	Memory allocation mask
1237878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * @nr_vecs:	Number of integrity metadata scatter-gather elements
1247878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen *
1257878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * Description: This function prepares a bio for attaching integrity
1267878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * metadata.  nr_vecs specifies the maximum number of pages containing
1277878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * integrity metadata that can be attached.
1287878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen */
1297878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenstruct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,
1307878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen						  gfp_t gfp_mask,
1317878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen						  unsigned int nr_vecs)
1327878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen{
1337878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	return bio_integrity_alloc_bioset(bio, gfp_mask, nr_vecs, fs_bio_set);
1347878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen}
1357ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_alloc);
1367ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1377ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
1387ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_free - Free bio integrity payload
1397ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio containing bip to be freed
1407878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * @bs:		bio_set this bio was allocated from
1417ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
1427ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Used to free the integrity portion of a bio. Usually
1437ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * called from bio_free().
1447ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
1457878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenvoid bio_integrity_free(struct bio *bio, struct bio_set *bs)
1467ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
1477ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip = bio->bi_integrity;
1487ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1497ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bip == NULL);
1507ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1517ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	/* A cloned bio doesn't own the integrity metadata */
15274aa8c2cc010035a7eef2b4ca4d6430e0dae206aMartin K. Petersen	if (!bio_flagged(bio, BIO_CLONED) && !bio_flagged(bio, BIO_FS_INTEGRITY)
15374aa8c2cc010035a7eef2b4ca4d6430e0dae206aMartin K. Petersen	    && bip->bip_buf != NULL)
1547ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		kfree(bip->bip_buf);
1557ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1567878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	if (use_bip_pool(bip->bip_slab))
1577878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		mempool_free(bip, bs->bio_integrity_pool);
1587878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	else
1597878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		kmem_cache_free(bip_slab[bip->bip_slab].slab, bip);
1607ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1617ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bio->bi_integrity = NULL;
1627ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
1637ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_free);
1647ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1657ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
1667ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_add_page - Attach integrity metadata
1677ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio to update
1687ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @page:	page containing integrity metadata
1697ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @len:	number of bytes of integrity metadata in page
1707ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @offset:	start offset within page
1717ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
1727ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Attach a page containing integrity metadata to bio.
1737ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
1747ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenint bio_integrity_add_page(struct bio *bio, struct page *page,
1757ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			   unsigned int len, unsigned int offset)
1767ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
1777ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip = bio->bi_integrity;
1787ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_vec *iv;
1797ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1807878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	if (bip->bip_vcnt >= bvec_nr_vecs(bip->bip_slab)) {
1817ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		printk(KERN_ERR "%s: bip_vec full\n", __func__);
1827ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		return 0;
1837ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
1847ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1857ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	iv = bip_vec_idx(bip, bip->bip_vcnt);
1867ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(iv == NULL);
1877ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1887ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	iv->bv_page = page;
1897ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	iv->bv_len = len;
1907ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	iv->bv_offset = offset;
1917ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip->bip_vcnt++;
1927ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1937ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return len;
1947ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
1957ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_add_page);
1967ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
1979c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboestatic int bdev_integrity_enabled(struct block_device *bdev, int rw)
1989c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe{
1999c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe	struct blk_integrity *bi = bdev_get_integrity(bdev);
2009c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe
2019c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe	if (bi == NULL)
2029c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe		return 0;
2039c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe
2049c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe	if (rw == READ && bi->verify_fn != NULL &&
2059c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe	    (bi->flags & INTEGRITY_FLAG_READ))
2069c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe		return 1;
2079c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe
2089c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe	if (rw == WRITE && bi->generate_fn != NULL &&
2099c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe	    (bi->flags & INTEGRITY_FLAG_WRITE))
2109c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe		return 1;
2119c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe
2129c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe	return 0;
2139c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe}
2149c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe
2157ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
2167ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_enabled - Check whether integrity can be passed
2177ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio to check
2187ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
2197ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Determines whether bio_integrity_prep() can be called
2207ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * on this bio or not.	bio data direction and target device must be
2217ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * set prior to calling.  The functions honors the write_generate and
2227ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * read_verify flags in sysfs.
2237ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
2247ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenint bio_integrity_enabled(struct bio *bio)
2257ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
2267ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	/* Already protected? */
2277ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (bio_integrity(bio))
2287ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		return 0;
2297ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2307ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return bdev_integrity_enabled(bio->bi_bdev, bio_data_dir(bio));
2317ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
2327ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_enabled);
2337ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2347ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
2357ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_hw_sectors - Convert 512b sectors to hardware ditto
2367ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bi:		blk_integrity profile for device
2377ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @sectors:	Number of 512 sectors to convert
2387ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
2397ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: The block layer calculates everything in 512 byte
2407ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * sectors but integrity metadata is done in terms of the hardware
2417ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * sector size of the storage device.  Convert the block layer sectors
2427ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * to physical sectors.
2437ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
244b984679efe1a616ec4ac919dba08286d71593900Jens Axboestatic inline unsigned int bio_integrity_hw_sectors(struct blk_integrity *bi,
245b984679efe1a616ec4ac919dba08286d71593900Jens Axboe						    unsigned int sectors)
2467ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
2477ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	/* At this point there are only 512b or 4096b DIF/EPP devices */
2487ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (bi->sector_size == 4096)
2497ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		return sectors >>= 3;
2507ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2517ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return sectors;
2527ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
2537ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2547ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
2557ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_tag_size - Retrieve integrity tag space
2567ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio to inspect
2577ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
2587ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Returns the maximum number of tag bytes that can be
2597ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * attached to this bio. Filesystems can use this to determine how
2607ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * much metadata to attach to an I/O.
2617ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
2627ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenunsigned int bio_integrity_tag_size(struct bio *bio)
2637ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
2647ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
2657ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2667ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bio->bi_size == 0);
2677ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2687ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return bi->tag_size * (bio->bi_size / bi->sector_size);
2697ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
2707ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_tag_size);
2717ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2727ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenint bio_integrity_tag(struct bio *bio, void *tag_buf, unsigned int len, int set)
2737ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
2747ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip = bio->bi_integrity;
2757ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
2767ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int nr_sectors;
2777ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2787ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bip->bip_buf == NULL);
2797ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2807ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (bi->tag_size == 0)
2817ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		return -1;
2827ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
283b984679efe1a616ec4ac919dba08286d71593900Jens Axboe	nr_sectors = bio_integrity_hw_sectors(bi,
284b984679efe1a616ec4ac919dba08286d71593900Jens Axboe					DIV_ROUND_UP(len, bi->tag_size));
2857ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2867ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (nr_sectors * bi->tuple_size > bip->bip_size) {
2877ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		printk(KERN_ERR "%s: tag too big for bio: %u > %u\n",
2887ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		       __func__, nr_sectors * bi->tuple_size, bip->bip_size);
2897ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		return -1;
2907ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
2917ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2927ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (set)
2937ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bi->set_tag_fn(bip->bip_buf, tag_buf, nr_sectors);
2947ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	else
2957ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bi->get_tag_fn(bip->bip_buf, tag_buf, nr_sectors);
2967ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
2977ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return 0;
2987ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
2997ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3007ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
3017ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_set_tag - Attach a tag buffer to a bio
3027ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio to attach buffer to
3037ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @tag_buf:	Pointer to a buffer containing tag data
3047ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @len:	Length of the included buffer
3057ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
3067ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Use this function to tag a bio by leveraging the extra
3077ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * space provided by devices formatted with integrity protection.  The
3087ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * size of the integrity buffer must be <= to the size reported by
3097ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_tag_size().
3107ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
3117ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenint bio_integrity_set_tag(struct bio *bio, void *tag_buf, unsigned int len)
3127ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
3137ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bio_data_dir(bio) != WRITE);
3147ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3157ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return bio_integrity_tag(bio, tag_buf, len, 1);
3167ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
3177ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_set_tag);
3187ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3197ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
3207ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_get_tag - Retrieve a tag buffer from a bio
3217ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio to retrieve buffer from
3227ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @tag_buf:	Pointer to a buffer for the tag data
3237ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @len:	Length of the target buffer
3247ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
3257ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Use this function to retrieve the tag buffer from a
3267ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * completed I/O. The size of the integrity buffer must be <= to the
3277ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * size reported by bio_integrity_tag_size().
3287ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
3297ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenint bio_integrity_get_tag(struct bio *bio, void *tag_buf, unsigned int len)
3307ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
3317ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bio_data_dir(bio) != READ);
3327ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3337ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return bio_integrity_tag(bio, tag_buf, len, 0);
3347ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
3357ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_get_tag);
3367ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3377ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
3387ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_generate - Generate integrity metadata for a bio
3397ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio to generate integrity metadata for
3407ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
3417ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Generates integrity metadata for a bio by calling the
3427ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * block device's generation callback function.  The bio must have a
3437ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bip attached with enough room to accommodate the generated
3447ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * integrity metadata.
3457ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
3467ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenstatic void bio_integrity_generate(struct bio *bio)
3477ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
3487ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
3497ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity_exchg bix;
3507ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_vec *bv;
3517ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	sector_t sector = bio->bi_sector;
3527ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int i, sectors, total;
3537ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	void *prot_buf = bio->bi_integrity->bip_buf;
3547ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3557ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	total = 0;
3567ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bix.disk_name = bio->bi_bdev->bd_disk->disk_name;
3577ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bix.sector_size = bi->sector_size;
3587ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3597ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bio_for_each_segment(bv, bio, i) {
3607ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		void *kaddr = kmap_atomic(bv->bv_page, KM_USER0);
3617ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bix.data_buf = kaddr + bv->bv_offset;
3627ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bix.data_size = bv->bv_len;
3637ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bix.prot_buf = prot_buf;
3647ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bix.sector = sector;
3657ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3667ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bi->generate_fn(&bix);
3677ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3687ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		sectors = bv->bv_len / bi->sector_size;
3697ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		sector += sectors;
3707ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		prot_buf += sectors * bi->tuple_size;
3717ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		total += sectors * bi->tuple_size;
3727ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		BUG_ON(total > bio->bi_integrity->bip_size);
3737ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3747ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		kunmap_atomic(kaddr, KM_USER0);
3757ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
3767ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
3777ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
3789c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboestatic inline unsigned short blk_integrity_tuple_size(struct blk_integrity *bi)
3799c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe{
3809c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe	if (bi)
3819c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe		return bi->tuple_size;
3829c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe
3839c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe	return 0;
3849c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe}
3859c02f2b02e29a2244e36c6e1f246080d8afc6cffJens Axboe
3867ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
3877ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_prep - Prepare bio for integrity I/O
3887ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio to prepare
3897ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
3907ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Allocates a buffer for integrity metadata, maps the
3917ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * pages and attaches them to a bio.  The bio must have data
3927ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * direction, target device and start sector set priot to calling.  In
3937ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * the WRITE case, integrity metadata will be generated using the
3947ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * block device's integrity function.  In the READ case, the buffer
3957ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * will be prepared for DMA and a suitable end_io handler set up.
3967ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
3977ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenint bio_integrity_prep(struct bio *bio)
3987ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
3997ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip;
4007ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity *bi;
4017ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct request_queue *q;
4027ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	void *buf;
4037ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned long start, end;
4047ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int len, nr_pages;
4057ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int bytes, offset, i;
4067ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int sectors;
4077ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4087ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bi = bdev_get_integrity(bio->bi_bdev);
4097ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	q = bdev_get_queue(bio->bi_bdev);
4107ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bi == NULL);
4117ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bio_integrity(bio));
4127ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4137ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	sectors = bio_integrity_hw_sectors(bi, bio_sectors(bio));
4147ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4157ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	/* Allocate kernel buffer for protection data */
4167ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	len = sectors * blk_integrity_tuple_size(bi);
41772f465033702ebfe20db8f50edaad59f0f38b0f5David Rientjes	buf = kmalloc(len, GFP_NOIO | q->bounce_gfp);
4187ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (unlikely(buf == NULL)) {
4197ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		printk(KERN_ERR "could not allocate integrity buffer\n");
420220eb7fd984bfc7e6b4005fdf32efe9cd8af7cf2Andrew Morton		return -ENOMEM;
4217ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
4227ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4237ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	end = (((unsigned long) buf) + len + PAGE_SIZE - 1) >> PAGE_SHIFT;
4247ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	start = ((unsigned long) buf) >> PAGE_SHIFT;
4257ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	nr_pages = end - start;
4267ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4277ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	/* Allocate bio integrity payload and integrity vectors */
4287ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip = bio_integrity_alloc(bio, GFP_NOIO, nr_pages);
4297ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (unlikely(bip == NULL)) {
4307ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		printk(KERN_ERR "could not allocate data integrity bioset\n");
4317ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		kfree(buf);
4327ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		return -EIO;
4337ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
4347ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4357ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip->bip_buf = buf;
4367ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip->bip_size = len;
4377ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip->bip_sector = bio->bi_sector;
4387ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4397ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	/* Map it */
4407ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	offset = offset_in_page(buf);
4417ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	for (i = 0 ; i < nr_pages ; i++) {
4427ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		int ret;
4437ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bytes = PAGE_SIZE - offset;
4447ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4457ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		if (len <= 0)
4467ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			break;
4477ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4487ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		if (bytes > len)
4497ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			bytes = len;
4507ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4517ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		ret = bio_integrity_add_page(bio, virt_to_page(buf),
4527ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen					     bytes, offset);
4537ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4547ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		if (ret == 0)
4557ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			return 0;
4567ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4577ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		if (ret < bytes)
4587ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			break;
4597ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4607ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		buf += bytes;
4617ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		len -= bytes;
4627ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		offset = 0;
4637ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
4647ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4657ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	/* Install custom I/O completion handler if read verify is enabled */
4667ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (bio_data_dir(bio) == READ) {
4677ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bip->bip_end_io = bio->bi_end_io;
4687ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bio->bi_end_io = bio_integrity_endio;
4697ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
4707ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4717ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	/* Auto-generate integrity metadata if this is a write */
4727ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (bio_data_dir(bio) == WRITE)
4737ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bio_integrity_generate(bio);
4747ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4757ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return 0;
4767ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
4777ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_prep);
4787ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4797ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
4807ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_verify - Verify integrity metadata for a bio
4817ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio to verify
4827ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
4837ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: This function is called to verify the integrity of a
4847ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio.	 The data in the bio io_vec is compared to the integrity
4857ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * metadata returned by the HBA.
4867ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
4877ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenstatic int bio_integrity_verify(struct bio *bio)
4887ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
4897ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
4907ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity_exchg bix;
4917ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_vec *bv;
4927ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	sector_t sector = bio->bi_integrity->bip_sector;
4937ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int i, sectors, total, ret;
4947ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	void *prot_buf = bio->bi_integrity->bip_buf;
4957ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
4967ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	ret = total = 0;
4977ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bix.disk_name = bio->bi_bdev->bd_disk->disk_name;
4987ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bix.sector_size = bi->sector_size;
4997ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5007ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bio_for_each_segment(bv, bio, i) {
5017ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		void *kaddr = kmap_atomic(bv->bv_page, KM_USER0);
5027ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bix.data_buf = kaddr + bv->bv_offset;
5037ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bix.data_size = bv->bv_len;
5047ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bix.prot_buf = prot_buf;
5057ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		bix.sector = sector;
5067ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5077ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		ret = bi->verify_fn(&bix);
5087ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5097ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		if (ret) {
5107ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			kunmap_atomic(kaddr, KM_USER0);
5117b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen			return ret;
5127ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		}
5137ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5147ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		sectors = bv->bv_len / bi->sector_size;
5157ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		sector += sectors;
5167ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		prot_buf += sectors * bi->tuple_size;
5177ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		total += sectors * bi->tuple_size;
5187ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		BUG_ON(total > bio->bi_integrity->bip_size);
5197ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5207ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		kunmap_atomic(kaddr, KM_USER0);
5217ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
5227ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5237ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return ret;
5247ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
5257ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5267ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
5277ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_verify_fn - Integrity I/O completion worker
5287ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @work:	Work struct stored in bio to be verified
5297ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
5307ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: This workqueue function is called to complete a READ
5317ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * request.  The function verifies the transferred integrity metadata
5327ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * and then calls the original bio end_io function.
5337ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
5347ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenstatic void bio_integrity_verify_fn(struct work_struct *work)
5357ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
536b984679efe1a616ec4ac919dba08286d71593900Jens Axboe	struct bio_integrity_payload *bip =
5377ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		container_of(work, struct bio_integrity_payload, bip_work);
5387ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio *bio = bip->bip_bio;
5397b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen	int error;
5407ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5417b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen	error = bio_integrity_verify(bio);
5427ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5437ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	/* Restore original bio completion handler */
5447ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bio->bi_end_io = bip->bip_end_io;
5457b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen	bio_endio(bio, error);
5467ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
5477ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5487ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
5497ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_endio - Integrity I/O completion function
5507ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	Protected bio
5517ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @error:	Pointer to errno
5527ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
5537ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Completion for integrity I/O
5547ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
5557ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Normally I/O completion is done in interrupt context.  However,
5567ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * verifying I/O integrity is a time-consuming task which must be run
5577ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * in process context.	This function postpones completion
5587ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * accordingly.
5597ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
5607ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenvoid bio_integrity_endio(struct bio *bio, int error)
5617ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
5627ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip = bio->bi_integrity;
5637ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5647ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bip->bip_bio != bio);
5657ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5667b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen	/* In case of an I/O error there is no point in verifying the
5677b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen	 * integrity metadata.  Restore original bio end_io handler
5687b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen	 * and run it.
5697b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen	 */
5707b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen	if (error) {
5717b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen		bio->bi_end_io = bip->bip_end_io;
5727b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen		bio_endio(bio, error);
5737b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen
5747b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen		return;
5757b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen	}
5767b24fc4d7eb611da367dea3aad45473050aacd6cMartin K. Petersen
5777ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	INIT_WORK(&bip->bip_work, bio_integrity_verify_fn);
5787ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	queue_work(kintegrityd_wq, &bip->bip_work);
5797ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
5807ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_endio);
5817ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5827ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
5837ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_mark_head - Advance bip_vec skip bytes
5847ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bip:	Integrity vector to advance
5857ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @skip:	Number of bytes to advance it
5867ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
587b984679efe1a616ec4ac919dba08286d71593900Jens Axboevoid bio_integrity_mark_head(struct bio_integrity_payload *bip,
588b984679efe1a616ec4ac919dba08286d71593900Jens Axboe			     unsigned int skip)
5897ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
5907ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_vec *iv;
5917ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int i;
5927ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
5937ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip_for_each_vec(iv, bip, i) {
5947ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		if (skip == 0) {
5957ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			bip->bip_idx = i;
5967ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			return;
5977ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		} else if (skip >= iv->bv_len) {
5987ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			skip -= iv->bv_len;
5997ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		} else { /* skip < iv->bv_len) */
6007ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			iv->bv_offset += skip;
6017ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			iv->bv_len -= skip;
6027ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			bip->bip_idx = i;
6037ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			return;
6047ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		}
6057ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
6067ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
6077ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6087ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
6097ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_mark_tail - Truncate bip_vec to be len bytes long
6107ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bip:	Integrity vector to truncate
6117ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @len:	New length of integrity vector
6127ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
613b984679efe1a616ec4ac919dba08286d71593900Jens Axboevoid bio_integrity_mark_tail(struct bio_integrity_payload *bip,
614b984679efe1a616ec4ac919dba08286d71593900Jens Axboe			     unsigned int len)
6157ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
6167ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_vec *iv;
6177ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int i;
6187ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6197ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip_for_each_vec(iv, bip, i) {
6207ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		if (len == 0) {
6217ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			bip->bip_vcnt = i;
6227ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			return;
6237ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		} else if (len >= iv->bv_len) {
6247ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			len -= iv->bv_len;
6257ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		} else { /* len < iv->bv_len) */
6267ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			iv->bv_len = len;
6277ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen			len = 0;
6287ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		}
6297ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	}
6307ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
6317ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6327ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
6337ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_advance - Advance integrity vector
6347ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio whose integrity vector to update
6357ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bytes_done:	number of data bytes that have been completed
6367ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
6377ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: This function calculates how many integrity bytes the
6387ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * number of completed data bytes correspond to and advances the
6397ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * integrity vector accordingly.
6407ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
6417ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenvoid bio_integrity_advance(struct bio *bio, unsigned int bytes_done)
6427ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
6437ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip = bio->bi_integrity;
6447ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
6457ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int nr_sectors;
6467ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6477ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bip == NULL);
6487ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bi == NULL);
6497ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6507ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	nr_sectors = bio_integrity_hw_sectors(bi, bytes_done >> 9);
6517ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bio_integrity_mark_head(bip, nr_sectors * bi->tuple_size);
6527ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
6537ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_advance);
6547ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6557ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
6567ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_trim - Trim integrity vector
6577ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	bio whose integrity vector to update
6587ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @offset:	offset to first data sector
6597ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @sectors:	number of data sectors
6607ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
6617ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Used to trim the integrity vector in a cloned bio.
6627ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * The ivec will be advanced corresponding to 'offset' data sectors
6637ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * and the length will be truncated corresponding to 'len' data
6647ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * sectors.
6657ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
666b984679efe1a616ec4ac919dba08286d71593900Jens Axboevoid bio_integrity_trim(struct bio *bio, unsigned int offset,
667b984679efe1a616ec4ac919dba08286d71593900Jens Axboe			unsigned int sectors)
6687ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
6697ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip = bio->bi_integrity;
6707ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
6717ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int nr_sectors;
6727ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6737ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bip == NULL);
6747ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bi == NULL);
6757ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(!bio_flagged(bio, BIO_CLONED));
6767ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6777ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	nr_sectors = bio_integrity_hw_sectors(bi, sectors);
6787ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip->bip_sector = bip->bip_sector + offset;
6797ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bio_integrity_mark_head(bip, offset * bi->tuple_size);
6807ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bio_integrity_mark_tail(bip, sectors * bi->tuple_size);
6817ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
6827ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_trim);
6837ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6847ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
6857ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_split - Split integrity metadata
6867ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	Protected bio
6877ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bp:		Resulting bio_pair
6887ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @sectors:	Offset
6897ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
6907ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description: Splits an integrity page into a bio_pair.
6917ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
6927ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersenvoid bio_integrity_split(struct bio *bio, struct bio_pair *bp, int sectors)
6937ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
6947ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct blk_integrity *bi;
6957ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip = bio->bi_integrity;
6967ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	unsigned int nr_sectors;
6977ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
6987ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (bio_integrity(bio) == 0)
6997ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		return;
7007ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7017ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bi = bdev_get_integrity(bio->bi_bdev);
7027ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bi == NULL);
7037ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bip->bip_vcnt != 1);
7047ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7057ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	nr_sectors = bio_integrity_hw_sectors(bi, sectors);
7067ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7077ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->bio1.bi_integrity = &bp->bip1;
7087ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->bio2.bi_integrity = &bp->bip2;
7097ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7107ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->iv1 = bip->bip_vec[0];
7117ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->iv2 = bip->bip_vec[0];
7127ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7137878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	bp->bip1.bip_vec[0] = bp->iv1;
7147878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	bp->bip2.bip_vec[0] = bp->iv2;
7157ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7167ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->iv1.bv_len = sectors * bi->tuple_size;
7177ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->iv2.bv_offset += sectors * bi->tuple_size;
7187ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->iv2.bv_len -= sectors * bi->tuple_size;
7197ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7207ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->bip1.bip_sector = bio->bi_integrity->bip_sector;
7217ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->bip2.bip_sector = bio->bi_integrity->bip_sector + nr_sectors;
7227ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7237ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->bip1.bip_vcnt = bp->bip2.bip_vcnt = 1;
7247ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bp->bip1.bip_idx = bp->bip2.bip_idx = 0;
7257ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
7267ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_split);
7277ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7287ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen/**
7297ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * bio_integrity_clone - Callback for cloning bios with integrity metadata
7307ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio:	New bio
7317ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * @bio_src:	Original bio
73287092698c665e0a358caf9825ae13114343027e8un'ichi Nomura * @gfp_mask:	Memory allocation mask
7337878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen * @bs:		bio_set to allocate bip from
7347ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen *
7357ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen * Description:	Called to allocate a bip when cloning a bio
7367ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen */
7377878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenint bio_integrity_clone(struct bio *bio, struct bio *bio_src,
7387878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen			gfp_t gfp_mask, struct bio_set *bs)
7397ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
7407ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip_src = bio_src->bi_integrity;
7417ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	struct bio_integrity_payload *bip;
7427ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7437ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	BUG_ON(bip_src == NULL);
7447ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7457878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	bip = bio_integrity_alloc_bioset(bio, gfp_mask, bip_src->bip_vcnt, bs);
7467ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7477ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	if (bip == NULL)
7487ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen		return -EIO;
7497ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7507ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	memcpy(bip->bip_vec, bip_src->bip_vec,
7517ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	       bip_src->bip_vcnt * sizeof(struct bio_vec));
7527ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7537ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip->bip_sector = bip_src->bip_sector;
7547ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip->bip_vcnt = bip_src->bip_vcnt;
7557ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	bip->bip_idx = bip_src->bip_idx;
7567ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7577ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen	return 0;
7587ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
7597ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. PetersenEXPORT_SYMBOL(bio_integrity_clone);
7607ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7617878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenint bioset_integrity_create(struct bio_set *bs, int pool_size)
7627ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen{
7637878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	unsigned int max_slab = vecs_to_idx(BIO_MAX_PAGES);
7647878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
765a91a2785b200864aef2270ed6a3babac7a253a20Martin K. Petersen	if (bs->bio_integrity_pool)
766a91a2785b200864aef2270ed6a3babac7a253a20Martin K. Petersen		return 0;
767a91a2785b200864aef2270ed6a3babac7a253a20Martin K. Petersen
7687878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	bs->bio_integrity_pool =
7697878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		mempool_create_slab_pool(pool_size, bip_slab[max_slab].slab);
7707ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7717878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	if (!bs->bio_integrity_pool)
7727878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		return -1;
7737878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
7747878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	return 0;
7757878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen}
7767878cba9f0037f5599004b03a1260b32d9050360Martin K. PetersenEXPORT_SYMBOL(bioset_integrity_create);
7777878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
7787878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenvoid bioset_integrity_free(struct bio_set *bs)
7797878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen{
7807878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	if (bs->bio_integrity_pool)
7817878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		mempool_destroy(bs->bio_integrity_pool);
7827878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen}
7837878cba9f0037f5599004b03a1260b32d9050360Martin K. PetersenEXPORT_SYMBOL(bioset_integrity_free);
7847878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
7857878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersenvoid __init bio_integrity_init(void)
7867878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen{
7877878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	unsigned int i;
7887878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen
789a6e8dc46ff0b7defbfa4f29a71aee263377ec573Tejun Heo	/*
790a6e8dc46ff0b7defbfa4f29a71aee263377ec573Tejun Heo	 * kintegrityd won't block much but may burn a lot of CPU cycles.
791a6e8dc46ff0b7defbfa4f29a71aee263377ec573Tejun Heo	 * Make it highpri CPU intensive wq with max concurrency of 1.
792a6e8dc46ff0b7defbfa4f29a71aee263377ec573Tejun Heo	 */
793a6e8dc46ff0b7defbfa4f29a71aee263377ec573Tejun Heo	kintegrityd_wq = alloc_workqueue("kintegrityd", WQ_MEM_RECLAIM |
794a6e8dc46ff0b7defbfa4f29a71aee263377ec573Tejun Heo					 WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1);
7956d2a78e783416ba99e36beb1d4395b785b34e867Martin K. Petersen	if (!kintegrityd_wq)
7966d2a78e783416ba99e36beb1d4395b785b34e867Martin K. Petersen		panic("Failed to create kintegrityd\n");
7977ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
7987878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	for (i = 0 ; i < BIOVEC_NR_POOLS ; i++) {
7997878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		unsigned int size;
8007ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
8017878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		size = sizeof(struct bio_integrity_payload)
8027878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen			+ bip_slab[i].nr_vecs * sizeof(struct bio_vec);
8037ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen
8047878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen		bip_slab[i].slab =
8057878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen			kmem_cache_create(bip_slab[i].name, size, 0,
8067878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen					  SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
8077878cba9f0037f5599004b03a1260b32d9050360Martin K. Petersen	}
8087ba1ba12eeef0aa7113beb16410ef8b7c748e18bMartin K. Petersen}
809