@@ -539,25 +539,41 @@ static int o2hb_verify_crc(struct o2hb_region *reg,
539
539
540
540
/* We want to make sure that nobody is heartbeating on top of us --
541
541
* this will help detect an invalid configuration. */
542
- static int o2hb_check_last_timestamp (struct o2hb_region * reg )
542
+ static void o2hb_check_last_timestamp (struct o2hb_region * reg )
543
543
{
544
- int node_num , ret ;
545
544
struct o2hb_disk_slot * slot ;
546
545
struct o2hb_disk_heartbeat_block * hb_block ;
546
+ char * errstr ;
547
547
548
- node_num = o2nm_this_node ();
549
-
550
- ret = 1 ;
551
- slot = & reg -> hr_slots [node_num ];
548
+ slot = & reg -> hr_slots [o2nm_this_node ()];
552
549
/* Don't check on our 1st timestamp */
553
- if (slot -> ds_last_time ) {
554
- hb_block = slot -> ds_raw_block ;
550
+ if (! slot -> ds_last_time )
551
+ return ;
555
552
556
- if (le64_to_cpu (hb_block -> hb_seq ) != slot -> ds_last_time )
557
- ret = 0 ;
558
- }
553
+ hb_block = slot -> ds_raw_block ;
554
+ if (le64_to_cpu (hb_block -> hb_seq ) == slot -> ds_last_time &&
555
+ le64_to_cpu (hb_block -> hb_generation ) == slot -> ds_last_generation &&
556
+ hb_block -> hb_node == slot -> ds_node_num )
557
+ return ;
559
558
560
- return ret ;
559
+ #define ERRSTR1 "Another node is heartbeating on device"
560
+ #define ERRSTR2 "Heartbeat generation mismatch on device"
561
+ #define ERRSTR3 "Heartbeat sequence mismatch on device"
562
+
563
+ if (hb_block -> hb_node != slot -> ds_node_num )
564
+ errstr = ERRSTR1 ;
565
+ else if (le64_to_cpu (hb_block -> hb_generation ) !=
566
+ slot -> ds_last_generation )
567
+ errstr = ERRSTR2 ;
568
+ else
569
+ errstr = ERRSTR3 ;
570
+
571
+ mlog (ML_ERROR , "%s (%s): expected(%u:0x%llx, 0x%llx), "
572
+ "ondisk(%u:0x%llx, 0x%llx)\n" , errstr , reg -> hr_dev_name ,
573
+ slot -> ds_node_num , (unsigned long long )slot -> ds_last_generation ,
574
+ (unsigned long long )slot -> ds_last_time , hb_block -> hb_node ,
575
+ (unsigned long long )le64_to_cpu (hb_block -> hb_generation ),
576
+ (unsigned long long )le64_to_cpu (hb_block -> hb_seq ));
561
577
}
562
578
563
579
static inline void o2hb_prepare_block (struct o2hb_region * reg ,
@@ -983,9 +999,7 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg)
983
999
/* With an up to date view of the slots, we can check that no
984
1000
* other node has been improperly configured to heartbeat in
985
1001
* our slot. */
986
- if (!o2hb_check_last_timestamp (reg ))
987
- mlog (ML_ERROR , "Device \"%s\": another node is heartbeating "
988
- "in our slot!\n" , reg -> hr_dev_name );
1002
+ o2hb_check_last_timestamp (reg );
989
1003
990
1004
/* fill in the proper info for our next heartbeat */
991
1005
o2hb_prepare_block (reg , reg -> hr_generation );
@@ -999,8 +1013,8 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg)
999
1013
}
1000
1014
1001
1015
i = -1 ;
1002
- while ((i = find_next_bit (configured_nodes , O2NM_MAX_NODES , i + 1 )) < O2NM_MAX_NODES ) {
1003
-
1016
+ while ((i = find_next_bit (configured_nodes ,
1017
+ O2NM_MAX_NODES , i + 1 )) < O2NM_MAX_NODES ) {
1004
1018
change |= o2hb_check_slot (reg , & reg -> hr_slots [i ]);
1005
1019
}
1006
1020
0 commit comments