@@ -57,12 +57,14 @@ static int check_compressed_csum(struct btrfs_inode *inode,
57
57
struct compressed_bio * cb ,
58
58
u64 disk_start )
59
59
{
60
+ struct btrfs_fs_info * fs_info = inode -> root -> fs_info ;
61
+ const u16 csum_size = btrfs_super_csum_size (fs_info -> super_copy );
60
62
int ret ;
61
63
struct page * page ;
62
64
unsigned long i ;
63
65
char * kaddr ;
64
66
u32 csum ;
65
- u32 * cb_sum = & cb -> sums ;
67
+ u8 * cb_sum = cb -> sums ;
66
68
67
69
if (inode -> flags & BTRFS_INODE_NODATASUM )
68
70
return 0 ;
@@ -76,13 +78,13 @@ static int check_compressed_csum(struct btrfs_inode *inode,
76
78
btrfs_csum_final (csum , (u8 * )& csum );
77
79
kunmap_atomic (kaddr );
78
80
79
- if (csum != * cb_sum ) {
81
+ if (memcmp ( & csum , cb_sum , csum_size ) ) {
80
82
btrfs_print_data_csum_error (inode , disk_start , csum ,
81
- * cb_sum , cb -> mirror_num );
83
+ * ( u32 * ) cb_sum , cb -> mirror_num );
82
84
ret = - EIO ;
83
85
goto fail ;
84
86
}
85
- cb_sum ++ ;
87
+ cb_sum += csum_size ;
86
88
87
89
}
88
90
ret = 0 ;
@@ -536,7 +538,8 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
536
538
struct extent_map * em ;
537
539
blk_status_t ret = BLK_STS_RESOURCE ;
538
540
int faili = 0 ;
539
- u32 * sums ;
541
+ const u16 csum_size = btrfs_super_csum_size (fs_info -> super_copy );
542
+ u8 * sums ;
540
543
541
544
em_tree = & BTRFS_I (inode )-> extent_tree ;
542
545
@@ -558,7 +561,7 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
558
561
cb -> errors = 0 ;
559
562
cb -> inode = inode ;
560
563
cb -> mirror_num = mirror_num ;
561
- sums = & cb -> sums ;
564
+ sums = cb -> sums ;
562
565
563
566
cb -> start = em -> orig_start ;
564
567
em_len = em -> len ;
@@ -617,6 +620,8 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
617
620
page -> mapping = NULL ;
618
621
if (submit || bio_add_page (comp_bio , page , PAGE_SIZE , 0 ) <
619
622
PAGE_SIZE ) {
623
+ unsigned int nr_sectors ;
624
+
620
625
ret = btrfs_bio_wq_end_io (fs_info , comp_bio ,
621
626
BTRFS_WQ_ENDIO_DATA );
622
627
BUG_ON (ret ); /* -ENOMEM */
@@ -631,11 +636,13 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
631
636
632
637
if (!(BTRFS_I (inode )-> flags & BTRFS_INODE_NODATASUM )) {
633
638
ret = btrfs_lookup_bio_sums (inode , comp_bio ,
634
- ( u8 * ) sums );
639
+ sums );
635
640
BUG_ON (ret ); /* -ENOMEM */
636
641
}
637
- sums += DIV_ROUND_UP (comp_bio -> bi_iter .bi_size ,
638
- fs_info -> sectorsize );
642
+
643
+ nr_sectors = DIV_ROUND_UP (comp_bio -> bi_iter .bi_size ,
644
+ fs_info -> sectorsize );
645
+ sums += csum_size * nr_sectors ;
639
646
640
647
ret = btrfs_map_bio (fs_info , comp_bio , mirror_num , 0 );
641
648
if (ret ) {
@@ -657,7 +664,7 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
657
664
BUG_ON (ret ); /* -ENOMEM */
658
665
659
666
if (!(BTRFS_I (inode )-> flags & BTRFS_INODE_NODATASUM )) {
660
- ret = btrfs_lookup_bio_sums (inode , comp_bio , ( u8 * ) sums );
667
+ ret = btrfs_lookup_bio_sums (inode , comp_bio , sums );
661
668
BUG_ON (ret ); /* -ENOMEM */
662
669
}
663
670
0 commit comments