Blame view
block/bio-integrity.c
12.3 KB
8c16567d8 block: switch all... |
1 |
// SPDX-License-Identifier: GPL-2.0 |
7ba1ba12e block: Block laye... |
2 3 4 |
/* * bio-integrity.c - bio data integrity extensions * |
7878cba9f block: Create bip... |
5 |
* Copyright (C) 2007, 2008, 2009 Oracle Corporation |
7ba1ba12e block: Block laye... |
6 |
* Written by: Martin K. Petersen <martin.petersen@oracle.com> |
7ba1ba12e block: Block laye... |
7 8 9 10 |
*/ #include <linux/blkdev.h> #include <linux/mempool.h> |
afeacc8c1 fs: add export.h ... |
11 |
#include <linux/export.h> |
7ba1ba12e block: Block laye... |
12 13 |
#include <linux/bio.h> #include <linux/workqueue.h> |
5a0e3ad6a include cleanup: ... |
14 |
#include <linux/slab.h> |
1179a5a08 block/bio-integri... |
15 |
#include "blk.h" |
7ba1ba12e block: Block laye... |
16 |
|
9f060e223 block: Convert in... |
17 |
#define BIP_INLINE_VECS 4 |
7878cba9f block: Create bip... |
18 |
|
9f060e223 block: Convert in... |
19 |
static struct kmem_cache *bip_slab; |
7ba1ba12e block: Block laye... |
20 |
static struct workqueue_struct *kintegrityd_wq; |
5a48fc147 block: blk_flush_... |
21 22 23 24 |
void blk_flush_integrity(void) { flush_workqueue(kintegrityd_wq); } |
7ba1ba12e block: Block laye... |
25 |
/** |
1e2a410ff block: Ues bi_poo... |
26 |
* bio_integrity_alloc - Allocate integrity payload and attach it to bio |
7ba1ba12e block: Block laye... |
27 28 29 |
* @bio: bio to attach integrity metadata to * @gfp_mask: Memory allocation mask * @nr_vecs: Number of integrity metadata scatter-gather elements |
7ba1ba12e block: Block laye... |
30 31 32 33 34 |
* * Description: This function prepares a bio for attaching integrity * metadata. nr_vecs specifies the maximum number of pages containing * integrity metadata that can be attached. */ |
1e2a410ff block: Ues bi_poo... |
35 36 37 |
struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio, gfp_t gfp_mask, unsigned int nr_vecs) |
7ba1ba12e block: Block laye... |
38 39 |
{ struct bio_integrity_payload *bip; |
1e2a410ff block: Ues bi_poo... |
40 |
struct bio_set *bs = bio->bi_pool; |
9f060e223 block: Convert in... |
41 |
unsigned inline_vecs; |
8aa6ba2f6 block: Convert bi... |
42 |
if (!bs || !mempool_initialized(&bs->bio_integrity_pool)) { |
7a102d904 block/bio-integri... |
43 |
bip = kmalloc(struct_size(bip, bip_inline_vecs, nr_vecs), gfp_mask); |
9f060e223 block: Convert in... |
44 45 |
inline_vecs = nr_vecs; } else { |
8aa6ba2f6 block: Convert bi... |
46 |
bip = mempool_alloc(&bs->bio_integrity_pool, gfp_mask); |
9f060e223 block: Convert in... |
47 |
inline_vecs = BIP_INLINE_VECS; |
7ba1ba12e block: Block laye... |
48 |
} |
9f060e223 block: Convert in... |
49 |
if (unlikely(!bip)) |
06c1e3902 blk-integrity: em... |
50 |
return ERR_PTR(-ENOMEM); |
9f060e223 block: Convert in... |
51 |
|
7878cba9f block: Create bip... |
52 |
memset(bip, 0, sizeof(*bip)); |
9f060e223 block: Convert in... |
53 |
if (nr_vecs > inline_vecs) { |
ed996a52c block: simplify a... |
54 |
unsigned long idx = 0; |
9f060e223 block: Convert in... |
55 |
bip->bip_vec = bvec_alloc(gfp_mask, nr_vecs, &idx, |
8aa6ba2f6 block: Convert bi... |
56 |
&bs->bvec_integrity_pool); |
9f060e223 block: Convert in... |
57 58 |
if (!bip->bip_vec) goto err; |
cbcd1054a bio-integrity: ad... |
59 |
bip->bip_max_vcnt = bvec_nr_vecs(idx); |
ed996a52c block: simplify a... |
60 |
bip->bip_slab = idx; |
9f060e223 block: Convert in... |
61 62 |
} else { bip->bip_vec = bip->bip_inline_vecs; |
cbcd1054a bio-integrity: ad... |
63 |
bip->bip_max_vcnt = inline_vecs; |
9f060e223 block: Convert in... |
64 |
} |
7ba1ba12e block: Block laye... |
65 66 |
bip->bip_bio = bio; bio->bi_integrity = bip; |
1eff9d322 block: rename bio... |
67 |
bio->bi_opf |= REQ_INTEGRITY; |
7ba1ba12e block: Block laye... |
68 69 |
return bip; |
9f060e223 block: Convert in... |
70 |
err: |
8aa6ba2f6 block: Convert bi... |
71 |
mempool_free(bip, &bs->bio_integrity_pool); |
06c1e3902 blk-integrity: em... |
72 |
return ERR_PTR(-ENOMEM); |
7ba1ba12e block: Block laye... |
73 |
} |
7ba1ba12e block: Block laye... |
74 75 76 77 78 |
EXPORT_SYMBOL(bio_integrity_alloc); /** * bio_integrity_free - Free bio integrity payload * @bio: bio containing bip to be freed |
7ba1ba12e block: Block laye... |
79 80 81 82 |
* * Description: Used to free the integrity portion of a bio. Usually * called from bio_free(). */ |
ccbc5d03c block: fix memlea... |
83 |
void bio_integrity_free(struct bio *bio) |
7ba1ba12e block: Block laye... |
84 |
{ |
180b2f95d block: Replace bi... |
85 |
struct bio_integrity_payload *bip = bio_integrity(bio); |
1e2a410ff block: Ues bi_poo... |
86 |
struct bio_set *bs = bio->bi_pool; |
b1f013885 block: Relocate b... |
87 |
if (bip->bip_flags & BIP_BLOCK_INTEGRITY) |
5f9378fa9 block: Remove bip... |
88 89 |
kfree(page_address(bip->bip_vec->bv_page) + bip->bip_vec->bv_offset); |
7ba1ba12e block: Block laye... |
90 |
|
8aa6ba2f6 block: Convert bi... |
91 92 |
if (bs && mempool_initialized(&bs->bio_integrity_pool)) { bvec_free(&bs->bvec_integrity_pool, bip->bip_vec, bip->bip_slab); |
9f060e223 block: Convert in... |
93 |
|
8aa6ba2f6 block: Convert bi... |
94 |
mempool_free(bip, &bs->bio_integrity_pool); |
9f060e223 block: Convert in... |
95 96 97 |
} else { kfree(bip); } |
7ba1ba12e block: Block laye... |
98 99 |
bio->bi_integrity = NULL; |
7c20f1168 bio-integrity: st... |
100 |
bio->bi_opf &= ~REQ_INTEGRITY; |
7ba1ba12e block: Block laye... |
101 |
} |
7ba1ba12e block: Block laye... |
102 103 104 105 106 107 108 109 110 111 112 113 114 |
/** * bio_integrity_add_page - Attach integrity metadata * @bio: bio to update * @page: page containing integrity metadata * @len: number of bytes of integrity metadata in page * @offset: start offset within page * * Description: Attach a page containing integrity metadata to bio. */ int bio_integrity_add_page(struct bio *bio, struct page *page, unsigned int len, unsigned int offset) { |
180b2f95d block: Replace bi... |
115 |
struct bio_integrity_payload *bip = bio_integrity(bio); |
7ba1ba12e block: Block laye... |
116 |
struct bio_vec *iv; |
cbcd1054a bio-integrity: ad... |
117 |
if (bip->bip_vcnt >= bip->bip_max_vcnt) { |
7ba1ba12e block: Block laye... |
118 119 120 121 |
printk(KERN_ERR "%s: bip_vec full ", __func__); return 0; } |
d57a5f7c6 bio-integrity: Co... |
122 |
iv = bip->bip_vec + bip->bip_vcnt; |
7ba1ba12e block: Block laye... |
123 |
|
87a816df5 block: Refuse add... |
124 |
if (bip->bip_vcnt && |
74d46992e block: replace bi... |
125 |
bvec_gap_to_prev(bio->bi_disk->queue, |
87a816df5 block: Refuse add... |
126 127 |
&bip->bip_vec[bip->bip_vcnt - 1], offset)) return 0; |
7ba1ba12e block: Block laye... |
128 129 130 131 132 133 134 135 136 137 |
iv->bv_page = page; iv->bv_len = len; iv->bv_offset = offset; bip->bip_vcnt++; return len; } EXPORT_SYMBOL(bio_integrity_add_page); /** |
185930885 block: Clean up t... |
138 |
* bio_integrity_process - Process integrity metadata for a bio |
bf36f9cfa fs/bio-integrity:... |
139 |
* @bio: bio to generate/verify integrity metadata for |
63573e359 bio-integrity: Re... |
140 |
* @proc_iter: iterator to process |
185930885 block: Clean up t... |
141 |
* @proc_fn: Pointer to the relevant processing function |
7ba1ba12e block: Block laye... |
142 |
*/ |
4e4cbee93 block: switch bio... |
143 |
static blk_status_t bio_integrity_process(struct bio *bio, |
63573e359 bio-integrity: Re... |
144 |
struct bvec_iter *proc_iter, integrity_processing_fn *proc_fn) |
7ba1ba12e block: Block laye... |
145 |
{ |
74d46992e block: replace bi... |
146 |
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk); |
185930885 block: Clean up t... |
147 |
struct blk_integrity_iter iter; |
594416a72 block: fix regres... |
148 149 |
struct bvec_iter bviter; struct bio_vec bv; |
5f9378fa9 block: Remove bip... |
150 |
struct bio_integrity_payload *bip = bio_integrity(bio); |
4e4cbee93 block: switch bio... |
151 |
blk_status_t ret = BLK_STS_OK; |
5f9378fa9 block: Remove bip... |
152 153 |
void *prot_buf = page_address(bip->bip_vec->bv_page) + bip->bip_vec->bv_offset; |
7ba1ba12e block: Block laye... |
154 |
|
74d46992e block: replace bi... |
155 |
iter.disk_name = bio->bi_disk->disk_name; |
a48f041d9 block: Reduce the... |
156 |
iter.interval = 1 << bi->interval_exp; |
63573e359 bio-integrity: Re... |
157 |
iter.seed = proc_iter->bi_sector; |
185930885 block: Clean up t... |
158 |
iter.prot_buf = prot_buf; |
7ba1ba12e block: Block laye... |
159 |
|
63573e359 bio-integrity: Re... |
160 |
__bio_for_each_segment(bv, bio, bviter, *proc_iter) { |
594416a72 block: fix regres... |
161 |
void *kaddr = kmap_atomic(bv.bv_page); |
7ba1ba12e block: Block laye... |
162 |
|
594416a72 block: fix regres... |
163 164 |
iter.data_buf = kaddr + bv.bv_offset; iter.data_size = bv.bv_len; |
185930885 block: Clean up t... |
165 166 167 168 169 170 |
ret = proc_fn(&iter); if (ret) { kunmap_atomic(kaddr); return ret; } |
7ba1ba12e block: Block laye... |
171 |
|
e8e3c3d66 fs: remove the se... |
172 |
kunmap_atomic(kaddr); |
7ba1ba12e block: Block laye... |
173 |
} |
bf36f9cfa fs/bio-integrity:... |
174 175 176 177 |
return ret; } /** |
7ba1ba12e block: Block laye... |
178 179 180 |
* bio_integrity_prep - Prepare bio for integrity I/O * @bio: bio to prepare * |
e23947bd7 bio-integrity: fo... |
181 182 183 184 185 186 |
* Description: Checks if the bio already has an integrity payload attached. * If it does, the payload has been generated by another kernel subsystem, * and we just pass it through. Otherwise allocates integrity payload. * The bio must have data direction, target device and start sector set priot * to calling. In the WRITE case, integrity metadata will be generated using * the block device's integrity function. In the READ case, the buffer |
7ba1ba12e block: Block laye... |
187 188 |
* will be prepared for DMA and a suitable end_io handler set up. */ |
e23947bd7 bio-integrity: fo... |
189 |
bool bio_integrity_prep(struct bio *bio) |
7ba1ba12e block: Block laye... |
190 191 |
{ struct bio_integrity_payload *bip; |
74d46992e block: replace bi... |
192 193 |
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk); struct request_queue *q = bio->bi_disk->queue; |
7ba1ba12e block: Block laye... |
194 195 196 197 |
void *buf; unsigned long start, end; unsigned int len, nr_pages; unsigned int bytes, offset, i; |
3be91c4a3 block: Deprecate ... |
198 |
unsigned int intervals; |
e23947bd7 bio-integrity: fo... |
199 |
blk_status_t status; |
7ba1ba12e block: Block laye... |
200 |
|
9346beb9d bio-integrity: mo... |
201 202 |
if (!bi) return true; |
e23947bd7 bio-integrity: fo... |
203 204 205 206 207 |
if (bio_op(bio) != REQ_OP_READ && bio_op(bio) != REQ_OP_WRITE) return true; if (!bio_sectors(bio)) return true; |
7ba1ba12e block: Block laye... |
208 |
|
e23947bd7 bio-integrity: fo... |
209 210 211 |
/* Already protected? */ if (bio_integrity(bio)) return true; |
e23947bd7 bio-integrity: fo... |
212 213 214 215 216 217 218 219 220 |
if (bio_data_dir(bio) == READ) { if (!bi->profile->verify_fn || !(bi->flags & BLK_INTEGRITY_VERIFY)) return true; } else { if (!bi->profile->generate_fn || !(bi->flags & BLK_INTEGRITY_GENERATE)) return true; } |
3be91c4a3 block: Deprecate ... |
221 |
intervals = bio_integrity_intervals(bi, bio_sectors(bio)); |
7ba1ba12e block: Block laye... |
222 223 |
/* Allocate kernel buffer for protection data */ |
3be91c4a3 block: Deprecate ... |
224 |
len = intervals * bi->tuple_size; |
72f465033 bio-integrity.c: ... |
225 |
buf = kmalloc(len, GFP_NOIO | q->bounce_gfp); |
e23947bd7 bio-integrity: fo... |
226 |
status = BLK_STS_RESOURCE; |
7ba1ba12e block: Block laye... |
227 228 229 |
if (unlikely(buf == NULL)) { printk(KERN_ERR "could not allocate integrity buffer "); |
e23947bd7 bio-integrity: fo... |
230 |
goto err_end_io; |
7ba1ba12e block: Block laye... |
231 232 233 234 235 236 237 238 |
} end = (((unsigned long) buf) + len + PAGE_SIZE - 1) >> PAGE_SHIFT; start = ((unsigned long) buf) >> PAGE_SHIFT; nr_pages = end - start; /* Allocate bio integrity payload and integrity vectors */ bip = bio_integrity_alloc(bio, GFP_NOIO, nr_pages); |
7b6c0f803 blk-integrity: ch... |
239 |
if (IS_ERR(bip)) { |
7ba1ba12e block: Block laye... |
240 241 242 |
printk(KERN_ERR "could not allocate data integrity bioset "); kfree(buf); |
e23947bd7 bio-integrity: fo... |
243 244 |
status = BLK_STS_RESOURCE; goto err_end_io; |
7ba1ba12e block: Block laye... |
245 |
} |
b1f013885 block: Relocate b... |
246 |
bip->bip_flags |= BIP_BLOCK_INTEGRITY; |
d57a5f7c6 bio-integrity: Co... |
247 |
bip->bip_iter.bi_size = len; |
185930885 block: Clean up t... |
248 |
bip_set_seed(bip, bio->bi_iter.bi_sector); |
7ba1ba12e block: Block laye... |
249 |
|
aae7df501 block: Integrity ... |
250 251 |
if (bi->flags & BLK_INTEGRITY_IP_CHECKSUM) bip->bip_flags |= BIP_IP_CHECKSUM; |
7ba1ba12e block: Block laye... |
252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
/* Map it */ offset = offset_in_page(buf); for (i = 0 ; i < nr_pages ; i++) { int ret; bytes = PAGE_SIZE - offset; if (len <= 0) break; if (bytes > len) bytes = len; ret = bio_integrity_add_page(bio, virt_to_page(buf), bytes, offset); |
e7bf90e5a block/bio-integri... |
266 267 268 269 270 271 272 |
if (ret == 0) { printk(KERN_ERR "could not attach integrity payload "); kfree(buf); status = BLK_STS_RESOURCE; goto err_end_io; } |
7ba1ba12e block: Block laye... |
273 274 275 276 277 278 279 280 |
if (ret < bytes) break; buf += bytes; len -= bytes; offset = 0; } |
7ba1ba12e block: Block laye... |
281 |
/* Auto-generate integrity metadata if this is a write */ |
63573e359 bio-integrity: Re... |
282 283 284 |
if (bio_data_dir(bio) == WRITE) { bio_integrity_process(bio, &bio->bi_iter, bi->profile->generate_fn); |
7759eb23f block: remove bio... |
285 286 |
} else { bip->bio_iter = bio->bi_iter; |
63573e359 bio-integrity: Re... |
287 |
} |
e23947bd7 bio-integrity: fo... |
288 289 290 291 292 293 |
return true; err_end_io: bio->bi_status = status; bio_endio(bio); return false; |
7ba1ba12e block: Block laye... |
294 |
|
7ba1ba12e block: Block laye... |
295 296 297 298 |
} EXPORT_SYMBOL(bio_integrity_prep); /** |
7ba1ba12e block: Block laye... |
299 300 301 302 303 304 305 306 307 |
* bio_integrity_verify_fn - Integrity I/O completion worker * @work: Work struct stored in bio to be verified * * Description: This workqueue function is called to complete a READ * request. The function verifies the transferred integrity metadata * and then calls the original bio end_io function. */ static void bio_integrity_verify_fn(struct work_struct *work) { |
b984679ef block: integrity ... |
308 |
struct bio_integrity_payload *bip = |
7ba1ba12e block: Block laye... |
309 310 |
container_of(work, struct bio_integrity_payload, bip_work); struct bio *bio = bip->bip_bio; |
74d46992e block: replace bi... |
311 |
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk); |
63573e359 bio-integrity: Re... |
312 313 314 315 316 317 |
/* * At the moment verify is called bio's iterator was advanced * during split and completion, we need to rewind iterator to * it's original position. */ |
7759eb23f block: remove bio... |
318 319 |
bio->bi_status = bio_integrity_process(bio, &bip->bio_iter, bi->profile->verify_fn); |
7c20f1168 bio-integrity: st... |
320 |
bio_integrity_free(bio); |
4246a0b63 block: add a bi_e... |
321 |
bio_endio(bio); |
7ba1ba12e block: Block laye... |
322 323 324 |
} /** |
7c20f1168 bio-integrity: st... |
325 |
* __bio_integrity_endio - Integrity I/O completion function |
7ba1ba12e block: Block laye... |
326 |
* @bio: Protected bio |
7ba1ba12e block: Block laye... |
327 328 329 330 331 332 333 334 |
* * Description: Completion for integrity I/O * * Normally I/O completion is done in interrupt context. However, * verifying I/O integrity is a time-consuming task which must be run * in process context. This function postpones completion * accordingly. */ |
7c20f1168 bio-integrity: st... |
335 |
bool __bio_integrity_endio(struct bio *bio) |
7ba1ba12e block: Block laye... |
336 |
{ |
97e05463e bio-integrity: Fi... |
337 |
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk); |
f86e28c4d bio-integrity: on... |
338 |
struct bio_integrity_payload *bip = bio_integrity(bio); |
c775d2098 bio-integrity: Fi... |
339 340 |
if (bio_op(bio) == REQ_OP_READ && !bio->bi_status && |
f86e28c4d bio-integrity: on... |
341 |
(bip->bip_flags & BIP_BLOCK_INTEGRITY) && bi->profile->verify_fn) { |
7c20f1168 bio-integrity: st... |
342 343 344 |
INIT_WORK(&bip->bip_work, bio_integrity_verify_fn); queue_work(kintegrityd_wq, &bip->bip_work); return false; |
7b24fc4d7 block: Don't veri... |
345 |
} |
7c20f1168 bio-integrity: st... |
346 347 |
bio_integrity_free(bio); return true; |
7ba1ba12e block: Block laye... |
348 |
} |
7ba1ba12e block: Block laye... |
349 350 |
/** |
7ba1ba12e block: Block laye... |
351 352 353 354 355 356 357 358 359 360 |
* bio_integrity_advance - Advance integrity vector * @bio: bio whose integrity vector to update * @bytes_done: number of data bytes that have been completed * * Description: This function calculates how many integrity bytes the * number of completed data bytes correspond to and advances the * integrity vector accordingly. */ void bio_integrity_advance(struct bio *bio, unsigned int bytes_done) { |
180b2f95d block: Replace bi... |
361 |
struct bio_integrity_payload *bip = bio_integrity(bio); |
74d46992e block: replace bi... |
362 |
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk); |
d57a5f7c6 bio-integrity: Co... |
363 |
unsigned bytes = bio_integrity_bytes(bi, bytes_done >> 9); |
7ba1ba12e block: Block laye... |
364 |
|
309a62fa3 bio-integrity: bi... |
365 |
bip->bip_iter.bi_sector += bytes_done >> 9; |
d57a5f7c6 bio-integrity: Co... |
366 |
bvec_iter_advance(bip->bip_vec, &bip->bip_iter, bytes); |
7ba1ba12e block: Block laye... |
367 |
} |
7ba1ba12e block: Block laye... |
368 369 370 371 |
/** * bio_integrity_trim - Trim integrity vector * @bio: bio whose integrity vector to update |
7ba1ba12e block: Block laye... |
372 373 |
* * Description: Used to trim the integrity vector in a cloned bio. |
7ba1ba12e block: Block laye... |
374 |
*/ |
fbd08e767 bio-integrity: fi... |
375 |
void bio_integrity_trim(struct bio *bio) |
7ba1ba12e block: Block laye... |
376 |
{ |
180b2f95d block: Replace bi... |
377 |
struct bio_integrity_payload *bip = bio_integrity(bio); |
74d46992e block: replace bi... |
378 |
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk); |
7ba1ba12e block: Block laye... |
379 |
|
fbd08e767 bio-integrity: fi... |
380 |
bip->bip_iter.bi_size = bio_integrity_bytes(bi, bio_sectors(bio)); |
7ba1ba12e block: Block laye... |
381 382 383 384 |
} EXPORT_SYMBOL(bio_integrity_trim); /** |
7ba1ba12e block: Block laye... |
385 386 387 |
* bio_integrity_clone - Callback for cloning bios with integrity metadata * @bio: New bio * @bio_src: Original bio |
87092698c block: Add gfp_ma... |
388 |
* @gfp_mask: Memory allocation mask |
7ba1ba12e block: Block laye... |
389 390 391 |
* * Description: Called to allocate a bip when cloning a bio */ |
7878cba9f block: Create bip... |
392 |
int bio_integrity_clone(struct bio *bio, struct bio *bio_src, |
1e2a410ff block: Ues bi_poo... |
393 |
gfp_t gfp_mask) |
7ba1ba12e block: Block laye... |
394 |
{ |
180b2f95d block: Replace bi... |
395 |
struct bio_integrity_payload *bip_src = bio_integrity(bio_src); |
7ba1ba12e block: Block laye... |
396 397 398 |
struct bio_integrity_payload *bip; BUG_ON(bip_src == NULL); |
1e2a410ff block: Ues bi_poo... |
399 |
bip = bio_integrity_alloc(bio, gfp_mask, bip_src->bip_vcnt); |
7b6c0f803 blk-integrity: ch... |
400 401 |
if (IS_ERR(bip)) return PTR_ERR(bip); |
7ba1ba12e block: Block laye... |
402 403 404 |
memcpy(bip->bip_vec, bip_src->bip_vec, bip_src->bip_vcnt * sizeof(struct bio_vec)); |
7ba1ba12e block: Block laye... |
405 |
bip->bip_vcnt = bip_src->bip_vcnt; |
d57a5f7c6 bio-integrity: Co... |
406 |
bip->bip_iter = bip_src->bip_iter; |
7ba1ba12e block: Block laye... |
407 408 409 410 |
return 0; } EXPORT_SYMBOL(bio_integrity_clone); |
7878cba9f block: Create bip... |
411 |
int bioset_integrity_create(struct bio_set *bs, int pool_size) |
7ba1ba12e block: Block laye... |
412 |
{ |
8aa6ba2f6 block: Convert bi... |
413 |
if (mempool_initialized(&bs->bio_integrity_pool)) |
a91a2785b block: Require su... |
414 |
return 0; |
8aa6ba2f6 block: Convert bi... |
415 416 |
if (mempool_init_slab_pool(&bs->bio_integrity_pool, pool_size, bip_slab)) |
9f060e223 block: Convert in... |
417 |
return -1; |
7ba1ba12e block: Block laye... |
418 |
|
8aa6ba2f6 block: Convert bi... |
419 420 |
if (biovec_init_pool(&bs->bvec_integrity_pool, pool_size)) { mempool_exit(&bs->bio_integrity_pool); |
7878cba9f block: Create bip... |
421 |
return -1; |
bc5c8f078 fs/bio-integrity:... |
422 |
} |
7878cba9f block: Create bip... |
423 424 425 426 427 428 429 |
return 0; } EXPORT_SYMBOL(bioset_integrity_create); void bioset_integrity_free(struct bio_set *bs) { |
8aa6ba2f6 block: Convert bi... |
430 431 |
mempool_exit(&bs->bio_integrity_pool); mempool_exit(&bs->bvec_integrity_pool); |
7878cba9f block: Create bip... |
432 |
} |
7878cba9f block: Create bip... |
433 434 435 |
void __init bio_integrity_init(void) { |
a6e8dc46f bio-integrity: ma... |
436 437 438 439 440 441 |
/* * kintegrityd won't block much but may burn a lot of CPU cycles. * Make it highpri CPU intensive wq with max concurrency of 1. */ kintegrityd_wq = alloc_workqueue("kintegrityd", WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_CPU_INTENSIVE, 1); |
6d2a78e78 block: add privat... |
442 443 444 |
if (!kintegrityd_wq) panic("Failed to create kintegrityd "); |
7ba1ba12e block: Block laye... |
445 |
|
9f060e223 block: Convert in... |
446 447 448 449 |
bip_slab = kmem_cache_create("bio_integrity_payload", sizeof(struct bio_integrity_payload) + sizeof(struct bio_vec) * BIP_INLINE_VECS, 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL); |
7ba1ba12e block: Block laye... |
450 |
} |