@@ -333,19 +333,61 @@ int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io,
333
333
return 0 ;
334
334
}
335
335
336
+ /*
337
+ * Calls function process for 1 << v->data_dev_block_bits bytes in the bio_vec
338
+ * starting from iter.
339
+ */
340
+ int verity_for_bv_block (struct dm_verity * v , struct dm_verity_io * io ,
341
+ struct bvec_iter * iter ,
342
+ int (* process )(struct dm_verity * v ,
343
+ struct dm_verity_io * io , u8 * data ,
344
+ size_t len ))
345
+ {
346
+ unsigned todo = 1 << v -> data_dev_block_bits ;
347
+ struct bio * bio = dm_bio_from_per_bio_data (io , v -> ti -> per_bio_data_size );
348
+
349
+ do {
350
+ int r ;
351
+ u8 * page ;
352
+ unsigned len ;
353
+ struct bio_vec bv = bio_iter_iovec (bio , * iter );
354
+
355
+ page = kmap_atomic (bv .bv_page );
356
+ len = bv .bv_len ;
357
+
358
+ if (likely (len >= todo ))
359
+ len = todo ;
360
+
361
+ r = process (v , io , page + bv .bv_offset , len );
362
+ kunmap_atomic (page );
363
+
364
+ if (r < 0 )
365
+ return r ;
366
+
367
+ bio_advance_iter (bio , iter , len );
368
+ todo -= len ;
369
+ } while (todo );
370
+
371
+ return 0 ;
372
+ }
373
+
374
+ static int verity_bv_hash_update (struct dm_verity * v , struct dm_verity_io * io ,
375
+ u8 * data , size_t len )
376
+ {
377
+ return verity_hash_update (v , verity_io_hash_desc (v , io ), data , len );
378
+ }
379
+
336
380
/*
337
381
* Verify one "dm_verity_io" structure.
338
382
*/
339
383
static int verity_verify_io (struct dm_verity_io * io )
340
384
{
341
385
struct dm_verity * v = io -> v ;
342
- struct bio * bio = dm_bio_from_per_bio_data (io ,
343
- v -> ti -> per_bio_data_size );
386
+ struct bvec_iter start ;
344
387
unsigned b ;
345
388
346
389
for (b = 0 ; b < io -> n_blocks ; b ++ ) {
347
390
int r ;
348
- unsigned todo ;
349
391
struct shash_desc * desc = verity_io_hash_desc (v , io );
350
392
351
393
r = verity_hash_for_block (v , io , io -> block + b ,
@@ -357,26 +399,10 @@ static int verity_verify_io(struct dm_verity_io *io)
357
399
if (unlikely (r < 0 ))
358
400
return r ;
359
401
360
- todo = 1 << v -> data_dev_block_bits ;
361
- do {
362
- u8 * page ;
363
- unsigned len ;
364
- struct bio_vec bv = bio_iter_iovec (bio , io -> iter );
365
-
366
- page = kmap_atomic (bv .bv_page );
367
- len = bv .bv_len ;
368
- if (likely (len >= todo ))
369
- len = todo ;
370
- r = verity_hash_update (v , desc , page + bv .bv_offset ,
371
- len );
372
- kunmap_atomic (page );
373
-
374
- if (unlikely (r < 0 ))
375
- return r ;
376
-
377
- bio_advance_iter (bio , & io -> iter , len );
378
- todo -= len ;
379
- } while (todo );
402
+ start = io -> iter ;
403
+ r = verity_for_bv_block (v , io , & io -> iter , verity_bv_hash_update );
404
+ if (unlikely (r < 0 ))
405
+ return r ;
380
406
381
407
r = verity_hash_final (v , desc , verity_io_real_digest (v , io ));
382
408
if (unlikely (r < 0 ))
0 commit comments