@@ -1688,6 +1688,16 @@ static void integrity_sector_checksum(struct dm_integrity_c *ic, sector_t sector
16881688 get_random_bytes (result , ic -> tag_size );
16891689}
16901690
1691+ static void * integrity_kmap (struct dm_integrity_c * ic , struct page * p )
1692+ {
1693+ return kmap_local_page (p );
1694+ }
1695+
1696+ static void integrity_kunmap (struct dm_integrity_c * ic , const void * ptr )
1697+ {
1698+ kunmap_local (ptr );
1699+ }
1700+
16911701static noinline void integrity_recheck (struct dm_integrity_io * dio , char * checksum )
16921702{
16931703 struct bio * bio = dm_bio_from_per_bio_data (dio , sizeof (struct dm_integrity_io ));
@@ -1838,7 +1848,7 @@ static void integrity_metadata(struct work_struct *w)
18381848 char * mem , * checksums_ptr ;
18391849
18401850again :
1841- mem = kmap_local_page ( bv_copy .bv_page );
1851+ mem = integrity_kmap ( ic , bv_copy .bv_page );
18421852 pos = 0 ;
18431853 checksums_ptr = checksums ;
18441854 do {
@@ -1848,7 +1858,7 @@ static void integrity_metadata(struct work_struct *w)
18481858 pos += ic -> sectors_per_block << SECTOR_SHIFT ;
18491859 sector += ic -> sectors_per_block ;
18501860 } while (pos < bv_copy .bv_len && sectors_to_process && checksums != checksums_onstack );
1851- kunmap_local ( mem );
1861+ integrity_kunmap ( ic , mem );
18521862
18531863 r = dm_integrity_rw_tag (ic , checksums , & dio -> metadata_block , & dio -> metadata_offset ,
18541864 checksums_ptr - checksums , dio -> op == REQ_OP_READ ? TAG_CMP : TAG_WRITE );
@@ -2072,19 +2082,6 @@ static bool __journal_read_write(struct dm_integrity_io *dio, struct bio *bio,
20722082 js ++ ;
20732083 mem_ptr += 1 << SECTOR_SHIFT ;
20742084 } while (++ s < ic -> sectors_per_block );
2075- #ifdef INTERNAL_VERIFY
2076- if (ic -> internal_hash ) {
2077- char checksums_onstack [MAX_T (size_t , HASH_MAX_DIGESTSIZE , MAX_TAG_SIZE )];
2078-
2079- integrity_sector_checksum (ic , logical_sector , mem + bv .bv_offset , checksums_onstack );
2080- if (unlikely (crypto_memneq (checksums_onstack , journal_entry_tag (ic , je ), ic -> tag_size ))) {
2081- DMERR_LIMIT ("Checksum failed when reading from journal, at sector 0x%llx" ,
2082- logical_sector );
2083- dm_audit_log_bio (DM_MSG_PREFIX , "journal-checksum" ,
2084- bio , logical_sector , 0 );
2085- }
2086- }
2087- #endif
20882085 }
20892086
20902087 if (!ic -> internal_hash ) {
@@ -2506,11 +2503,11 @@ static int dm_integrity_map_inline(struct dm_integrity_io *dio, bool from_map)
25062503 unsigned pos = 0 ;
25072504 while (dio -> bio_details .bi_iter .bi_size ) {
25082505 struct bio_vec bv = bio_iter_iovec (bio , dio -> bio_details .bi_iter );
2509- const char * mem = kmap_local_page ( bv .bv_page );
2506+ const char * mem = integrity_kmap ( ic , bv .bv_page );
25102507 if (ic -> tag_size < ic -> tuple_size )
25112508 memset (dio -> integrity_payload + pos + ic -> tag_size , 0 , ic -> tuple_size - ic -> tuple_size );
25122509 integrity_sector_checksum (ic , dio -> bio_details .bi_iter .bi_sector , mem + bv .bv_offset , dio -> integrity_payload + pos );
2513- kunmap_local ( mem );
2510+ integrity_kunmap ( ic , mem );
25142511 pos += ic -> tuple_size ;
25152512 bio_advance_iter_single (bio , & dio -> bio_details .bi_iter , ic -> sectors_per_block << SECTOR_SHIFT );
25162513 }
@@ -2626,17 +2623,17 @@ static int dm_integrity_end_io(struct dm_target *ti, struct bio *bio, blk_status
26262623 while (dio -> bio_details .bi_iter .bi_size ) {
26272624 char digest [HASH_MAX_DIGESTSIZE ];
26282625 struct bio_vec bv = bio_iter_iovec (bio , dio -> bio_details .bi_iter );
2629- char * mem = kmap_local_page ( bv .bv_page );
2626+ char * mem = integrity_kmap ( ic , bv .bv_page );
26302627 integrity_sector_checksum (ic , dio -> bio_details .bi_iter .bi_sector , mem + bv .bv_offset , digest );
26312628 if (unlikely (crypto_memneq (digest , dio -> integrity_payload + pos ,
26322629 min (ic -> internal_hash_digestsize , ic -> tag_size )))) {
2633- kunmap_local ( mem );
2630+ integrity_kunmap ( ic , mem );
26342631 dm_integrity_free_payload (dio );
26352632 INIT_WORK (& dio -> work , dm_integrity_inline_recheck );
26362633 queue_work (ic -> offload_wq , & dio -> work );
26372634 return DM_ENDIO_INCOMPLETE ;
26382635 }
2639- kunmap_local ( mem );
2636+ integrity_kunmap ( ic , mem );
26402637 pos += ic -> tuple_size ;
26412638 bio_advance_iter_single (bio , & dio -> bio_details .bi_iter , ic -> sectors_per_block << SECTOR_SHIFT );
26422639 }
0 commit comments