@@ -172,6 +172,7 @@ static int __btrfs_lookup_bio_sums(struct btrfs_root *root,
172
172
u64 item_start_offset = 0 ;
173
173
u64 item_last_offset = 0 ;
174
174
u64 disk_bytenr ;
175
+ u64 page_bytes_left ;
175
176
u32 diff ;
176
177
int nblocks ;
177
178
int bio_index = 0 ;
@@ -220,6 +221,8 @@ static int __btrfs_lookup_bio_sums(struct btrfs_root *root,
220
221
disk_bytenr = (u64 )bio -> bi_iter .bi_sector << 9 ;
221
222
if (dio )
222
223
offset = logical_offset ;
224
+
225
+ page_bytes_left = bvec -> bv_len ;
223
226
while (bio_index < bio -> bi_vcnt ) {
224
227
if (!dio )
225
228
offset = page_offset (bvec -> bv_page ) + bvec -> bv_offset ;
@@ -243,7 +246,7 @@ static int __btrfs_lookup_bio_sums(struct btrfs_root *root,
243
246
if (BTRFS_I (inode )-> root -> root_key .objectid ==
244
247
BTRFS_DATA_RELOC_TREE_OBJECTID ) {
245
248
set_extent_bits (io_tree , offset ,
246
- offset + bvec -> bv_len - 1 ,
249
+ offset + root -> sectorsize - 1 ,
247
250
EXTENT_NODATASUM , GFP_NOFS );
248
251
} else {
249
252
btrfs_info (BTRFS_I (inode )-> root -> fs_info ,
@@ -281,11 +284,17 @@ static int __btrfs_lookup_bio_sums(struct btrfs_root *root,
281
284
found :
282
285
csum += count * csum_size ;
283
286
nblocks -= count ;
284
- bio_index += count ;
287
+
285
288
while (count -- ) {
286
- disk_bytenr += bvec -> bv_len ;
287
- offset += bvec -> bv_len ;
288
- bvec ++ ;
289
+ disk_bytenr += root -> sectorsize ;
290
+ offset += root -> sectorsize ;
291
+ page_bytes_left -= root -> sectorsize ;
292
+ if (!page_bytes_left ) {
293
+ bio_index ++ ;
294
+ bvec ++ ;
295
+ page_bytes_left = bvec -> bv_len ;
296
+ }
297
+
289
298
}
290
299
}
291
300
btrfs_free_path (path );
@@ -432,6 +441,8 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode,
432
441
struct bio_vec * bvec = bio -> bi_io_vec ;
433
442
int bio_index = 0 ;
434
443
int index ;
444
+ int nr_sectors ;
445
+ int i ;
435
446
unsigned long total_bytes = 0 ;
436
447
unsigned long this_sum_bytes = 0 ;
437
448
u64 offset ;
@@ -459,41 +470,56 @@ int btrfs_csum_one_bio(struct btrfs_root *root, struct inode *inode,
459
470
if (!contig )
460
471
offset = page_offset (bvec -> bv_page ) + bvec -> bv_offset ;
461
472
462
- if (offset >= ordered -> file_offset + ordered -> len ||
463
- offset < ordered -> file_offset ) {
464
- unsigned long bytes_left ;
465
- sums -> len = this_sum_bytes ;
466
- this_sum_bytes = 0 ;
467
- btrfs_add_ordered_sum (inode , ordered , sums );
468
- btrfs_put_ordered_extent (ordered );
473
+ data = kmap_atomic (bvec -> bv_page );
469
474
470
- bytes_left = bio -> bi_iter .bi_size - total_bytes ;
475
+ nr_sectors = BTRFS_BYTES_TO_BLKS (root -> fs_info ,
476
+ bvec -> bv_len + root -> sectorsize
477
+ - 1 );
478
+
479
+ for (i = 0 ; i < nr_sectors ; i ++ ) {
480
+ if (offset >= ordered -> file_offset + ordered -> len ||
481
+ offset < ordered -> file_offset ) {
482
+ unsigned long bytes_left ;
483
+
484
+ kunmap_atomic (data );
485
+ sums -> len = this_sum_bytes ;
486
+ this_sum_bytes = 0 ;
487
+ btrfs_add_ordered_sum (inode , ordered , sums );
488
+ btrfs_put_ordered_extent (ordered );
489
+
490
+ bytes_left = bio -> bi_iter .bi_size - total_bytes ;
491
+
492
+ sums = kzalloc (btrfs_ordered_sum_size (root , bytes_left ),
493
+ GFP_NOFS );
494
+ BUG_ON (!sums ); /* -ENOMEM */
495
+ sums -> len = bytes_left ;
496
+ ordered = btrfs_lookup_ordered_extent (inode ,
497
+ offset );
498
+ ASSERT (ordered ); /* Logic error */
499
+ sums -> bytenr = ((u64 )bio -> bi_iter .bi_sector << 9 )
500
+ + total_bytes ;
501
+ index = 0 ;
502
+
503
+ data = kmap_atomic (bvec -> bv_page );
504
+ }
471
505
472
- sums = kzalloc (btrfs_ordered_sum_size (root , bytes_left ),
473
- GFP_NOFS );
474
- BUG_ON (!sums ); /* -ENOMEM */
475
- sums -> len = bytes_left ;
476
- ordered = btrfs_lookup_ordered_extent (inode , offset );
477
- BUG_ON (!ordered ); /* Logic error */
478
- sums -> bytenr = ((u64 )bio -> bi_iter .bi_sector << 9 ) +
479
- total_bytes ;
480
- index = 0 ;
506
+ sums -> sums [index ] = ~(u32 )0 ;
507
+ sums -> sums [index ]
508
+ = btrfs_csum_data (data + bvec -> bv_offset
509
+ + (i * root -> sectorsize ),
510
+ sums -> sums [index ],
511
+ root -> sectorsize );
512
+ btrfs_csum_final (sums -> sums [index ],
513
+ (char * )(sums -> sums + index ));
514
+ index ++ ;
515
+ offset += root -> sectorsize ;
516
+ this_sum_bytes += root -> sectorsize ;
517
+ total_bytes += root -> sectorsize ;
481
518
}
482
519
483
- data = kmap_atomic (bvec -> bv_page );
484
- sums -> sums [index ] = ~(u32 )0 ;
485
- sums -> sums [index ] = btrfs_csum_data (data + bvec -> bv_offset ,
486
- sums -> sums [index ],
487
- bvec -> bv_len );
488
520
kunmap_atomic (data );
489
- btrfs_csum_final (sums -> sums [index ],
490
- (char * )(sums -> sums + index ));
491
521
492
522
bio_index ++ ;
493
- index ++ ;
494
- total_bytes += bvec -> bv_len ;
495
- this_sum_bytes += bvec -> bv_len ;
496
- offset += bvec -> bv_len ;
497
523
bvec ++ ;
498
524
}
499
525
this_sum_bytes = 0 ;
0 commit comments