]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/ocfs2/cluster/heartbeat.c
ocfs2/cluster: Maintain live node bitmap per heartbeat region
[mv-sheeva.git] / fs / ocfs2 / cluster / heartbeat.c
index 16e49765c8534409207117b59fbc5adf6866f599..188f50269b892e84c3687087fe3e5ea775199ce2 100644 (file)
@@ -174,6 +174,9 @@ struct o2hb_region {
        struct block_device     *hr_bdev;
        struct o2hb_disk_slot   *hr_slots;
 
+       /* live node map of this region */
+       unsigned long           hr_live_node_bitmap[BITS_TO_LONGS(O2NM_MAX_NODES)];
+
        /* let the person setting up hb wait for it to return until it
         * has reached a 'steady' state.  This will be fixed when we have
         * a more complete api that doesn't lead to this sort of fragility. */
@@ -688,6 +691,8 @@ fire_callbacks:
                mlog(ML_HEARTBEAT, "Node %d (id 0x%llx) joined my region\n",
                     slot->ds_node_num, (long long)slot->ds_last_generation);
 
+               set_bit(slot->ds_node_num, reg->hr_live_node_bitmap);
+
                /* first on the list generates a callback */
                if (list_empty(&o2hb_live_slots[slot->ds_node_num])) {
                        set_bit(slot->ds_node_num, o2hb_live_node_bitmap);
@@ -733,6 +738,8 @@ fire_callbacks:
                mlog(ML_HEARTBEAT, "Node %d left my region\n",
                     slot->ds_node_num);
 
+               clear_bit(slot->ds_node_num, reg->hr_live_node_bitmap);
+
                /* last off the live_slot generates a callback */
                list_del_init(&slot->ds_live_item);
                if (list_empty(&o2hb_live_slots[slot->ds_node_num])) {