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