2222#define MAX_CSUM_ITEMS (r , size ) (min_t(u32, __MAX_CSUM_ITEMS(r, size), \
2323 PAGE_SIZE))
2424
25- #define MAX_ORDERED_SUM_BYTES (fs_info ) ((PAGE_SIZE - \
26- sizeof(struct btrfs_ordered_sum)) / \
27- sizeof(u32) * (fs_info)->sectorsize)
25+ static inline u32 max_ordered_sum_bytes (struct btrfs_fs_info * fs_info ,
26+ u16 csum_size )
27+ {
28+ u32 ncsums = (PAGE_SIZE - sizeof (struct btrfs_ordered_sum )) / csum_size ;
29+
30+ return ncsums * fs_info -> sectorsize ;
31+ }
2832
2933int btrfs_insert_file_extent (struct btrfs_trans_handle * trans ,
3034 struct btrfs_root * root ,
@@ -144,7 +148,7 @@ int btrfs_lookup_file_extent(struct btrfs_trans_handle *trans,
144148}
145149
146150static blk_status_t __btrfs_lookup_bio_sums (struct inode * inode , struct bio * bio ,
147- u64 logical_offset , u32 * dst , int dio )
151+ u64 logical_offset , u8 * dst , int dio )
148152{
149153 struct btrfs_fs_info * fs_info = btrfs_sb (inode -> i_sb );
150154 struct bio_vec bvec ;
@@ -211,7 +215,7 @@ static blk_status_t __btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio
211215 if (!dio )
212216 offset = page_offset (bvec .bv_page ) + bvec .bv_offset ;
213217 count = btrfs_find_ordered_sum (inode , offset , disk_bytenr ,
214- ( u32 * ) csum , nblocks );
218+ csum , nblocks );
215219 if (count )
216220 goto found ;
217221
@@ -283,7 +287,8 @@ static blk_status_t __btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio
283287 return 0 ;
284288}
285289
286- blk_status_t btrfs_lookup_bio_sums (struct inode * inode , struct bio * bio , u32 * dst )
290+ blk_status_t btrfs_lookup_bio_sums (struct inode * inode , struct bio * bio ,
291+ u8 * dst )
287292{
288293 return __btrfs_lookup_bio_sums (inode , bio , 0 , dst , 0 );
289294}
@@ -374,7 +379,7 @@ int btrfs_lookup_csums_range(struct btrfs_root *root, u64 start, u64 end,
374379 struct btrfs_csum_item );
375380 while (start < csum_end ) {
376381 size = min_t (size_t , csum_end - start ,
377- MAX_ORDERED_SUM_BYTES (fs_info ));
382+ max_ordered_sum_bytes (fs_info , csum_size ));
378383 sums = kzalloc (btrfs_ordered_sum_size (fs_info , size ),
379384 GFP_NOFS );
380385 if (!sums ) {
@@ -439,6 +444,7 @@ blk_status_t btrfs_csum_one_bio(struct inode *inode, struct bio *bio,
439444 int i ;
440445 u64 offset ;
441446 unsigned nofs_flag ;
447+ const u16 csum_size = btrfs_super_csum_size (fs_info -> super_copy );
442448
443449 nofs_flag = memalloc_nofs_save ();
444450 sums = kvzalloc (btrfs_ordered_sum_size (fs_info , bio -> bi_iter .bi_size ),
@@ -473,6 +479,8 @@ blk_status_t btrfs_csum_one_bio(struct inode *inode, struct bio *bio,
473479 - 1 );
474480
475481 for (i = 0 ; i < nr_sectors ; i ++ ) {
482+ u32 tmp ;
483+
476484 if (offset >= ordered -> file_offset + ordered -> len ||
477485 offset < ordered -> file_offset ) {
478486 unsigned long bytes_left ;
@@ -498,17 +506,16 @@ blk_status_t btrfs_csum_one_bio(struct inode *inode, struct bio *bio,
498506 index = 0 ;
499507 }
500508
501- sums -> sums [index ] = ~( u32 ) 0 ;
509+ memset ( & sums -> sums [index ], 0xff , csum_size ) ;
502510 data = kmap_atomic (bvec .bv_page );
503- sums -> sums [index ]
504- = btrfs_csum_data (data + bvec .bv_offset
511+ tmp = btrfs_csum_data (data + bvec .bv_offset
505512 + (i * fs_info -> sectorsize ),
506- sums -> sums [index ],
513+ * ( u32 * ) & sums -> sums [index ],
507514 fs_info -> sectorsize );
508515 kunmap_atomic (data );
509- btrfs_csum_final (sums -> sums [ index ] ,
516+ btrfs_csum_final (tmp ,
510517 (char * )(sums -> sums + index ));
511- index ++ ;
518+ index += csum_size ;
512519 offset += fs_info -> sectorsize ;
513520 this_sum_bytes += fs_info -> sectorsize ;
514521 total_bytes += fs_info -> sectorsize ;
@@ -904,9 +911,9 @@ int btrfs_csum_file_blocks(struct btrfs_trans_handle *trans,
904911 write_extent_buffer (leaf , sums -> sums + index , (unsigned long )item ,
905912 ins_size );
906913
914+ index += ins_size ;
907915 ins_size /= csum_size ;
908916 total_bytes += ins_size * fs_info -> sectorsize ;
909- index += ins_size ;
910917
911918 btrfs_mark_buffer_dirty (path -> nodes [0 ]);
912919 if (total_bytes < sums -> len ) {
0 commit comments