@@ -432,6 +432,21 @@ xfs_rtfind_forw(
432
432
return 0 ;
433
433
}
434
434
435
+ /* Log rtsummary counter at @infoword. */
436
+ static inline void
437
+ xfs_trans_log_rtsummary (
438
+ struct xfs_trans * tp ,
439
+ struct xfs_buf * bp ,
440
+ unsigned int infoword )
441
+ {
442
+ size_t first , last ;
443
+
444
+ first = (void * )xfs_rsumblock_infoptr (bp , infoword ) - bp -> b_addr ;
445
+ last = first + sizeof (xfs_suminfo_t ) - 1 ;
446
+
447
+ xfs_trans_log_buf (tp , bp , first , last );
448
+ }
449
+
435
450
/*
436
451
* Read and/or modify the summary information for a given extent size,
437
452
* bitmap block combination.
@@ -497,16 +512,14 @@ xfs_rtmodify_summary_int(
497
512
infoword = xfs_rtsumoffs_to_infoword (mp , so );
498
513
sp = xfs_rsumblock_infoptr (bp , infoword );
499
514
if (delta ) {
500
- uint first = (uint )((char * )sp - (char * )bp -> b_addr );
501
-
502
515
* sp += delta ;
503
516
if (mp -> m_rsum_cache ) {
504
517
if (* sp == 0 && log == mp -> m_rsum_cache [bbno ])
505
518
mp -> m_rsum_cache [bbno ]++ ;
506
519
if (* sp != 0 && log < mp -> m_rsum_cache [bbno ])
507
520
mp -> m_rsum_cache [bbno ] = log ;
508
521
}
509
- xfs_trans_log_buf (tp , bp , first , first + sizeof ( * sp ) - 1 );
522
+ xfs_trans_log_rtsummary (tp , bp , infoword );
510
523
}
511
524
if (sum )
512
525
* sum = * sp ;
@@ -527,6 +540,22 @@ xfs_rtmodify_summary(
527
540
delta , rbpp , rsb , NULL );
528
541
}
529
542
543
+ /* Log rtbitmap block from the word @from to the byte before @next. */
544
+ static inline void
545
+ xfs_trans_log_rtbitmap (
546
+ struct xfs_trans * tp ,
547
+ struct xfs_buf * bp ,
548
+ unsigned int from ,
549
+ unsigned int next )
550
+ {
551
+ size_t first , last ;
552
+
553
+ first = (void * )xfs_rbmblock_wordptr (bp , from ) - bp -> b_addr ;
554
+ last = ((void * )xfs_rbmblock_wordptr (bp , next ) - 1 ) - bp -> b_addr ;
555
+
556
+ xfs_trans_log_buf (tp , bp , first , last );
557
+ }
558
+
530
559
/*
531
560
* Set the given range of bitmap bits to the given value.
532
561
* Do whatever I/O and logging is required.
@@ -548,6 +577,7 @@ xfs_rtmodify_range(
548
577
int i ; /* current bit number rel. to start */
549
578
int lastbit ; /* last useful bit in word */
550
579
xfs_rtword_t mask ; /* mask o frelevant bits for value */
580
+ unsigned int firstword ; /* first word used in the buffer */
551
581
unsigned int word ; /* word number in the buffer */
552
582
553
583
/*
@@ -565,7 +595,7 @@ xfs_rtmodify_range(
565
595
/*
566
596
* Compute the starting word's address, and starting bit.
567
597
*/
568
- word = xfs_rtx_to_rbmword (mp , start );
598
+ firstword = word = xfs_rtx_to_rbmword (mp , start );
569
599
first = b = xfs_rbmblock_wordptr (bp , word );
570
600
bit = (int )(start & (XFS_NBWORD - 1 ));
571
601
/*
@@ -599,15 +629,13 @@ xfs_rtmodify_range(
599
629
* Log the changed part of this block.
600
630
* Get the next one.
601
631
*/
602
- xfs_trans_log_buf (tp , bp ,
603
- (uint )((char * )first - (char * )bp -> b_addr ),
604
- (uint )((char * )b - (char * )bp -> b_addr ));
632
+ xfs_trans_log_rtbitmap (tp , bp , firstword , word );
605
633
error = xfs_rtbuf_get (mp , tp , ++ block , 0 , & bp );
606
634
if (error ) {
607
635
return error ;
608
636
}
609
637
610
- word = 0 ;
638
+ firstword = word = 0 ;
611
639
first = b = xfs_rbmblock_wordptr (bp , word );
612
640
} else {
613
641
/*
@@ -640,15 +668,13 @@ xfs_rtmodify_range(
640
668
* Log the changed part of this block.
641
669
* Get the next one.
642
670
*/
643
- xfs_trans_log_buf (tp , bp ,
644
- (uint )((char * )first - (char * )bp -> b_addr ),
645
- (uint )((char * )b - (char * )bp -> b_addr ));
671
+ xfs_trans_log_rtbitmap (tp , bp , firstword , word );
646
672
error = xfs_rtbuf_get (mp , tp , ++ block , 0 , & bp );
647
673
if (error ) {
648
674
return error ;
649
675
}
650
676
651
- word = 0 ;
677
+ firstword = word = 0 ;
652
678
first = b = xfs_rbmblock_wordptr (bp , word );
653
679
} else {
654
680
/*
@@ -673,15 +699,14 @@ xfs_rtmodify_range(
673
699
* b |= mask ;
674
700
else
675
701
* b &= ~mask ;
702
+ word ++ ;
676
703
b ++ ;
677
704
}
678
705
/*
679
706
* Log any remaining changed bytes.
680
707
*/
681
708
if (b > first )
682
- xfs_trans_log_buf (tp , bp ,
683
- (uint )((char * )first - (char * )bp -> b_addr ),
684
- (uint )((char * )b - (char * )bp -> b_addr - 1 ));
709
+ xfs_trans_log_rtbitmap (tp , bp , firstword , word );
685
710
return 0 ;
686
711
}
687
712
0 commit comments