• Joyce's avatar
    ocfs2: fix a tiny race case when firing callbacks · 6f8648e8
    Joyce authored
    In o2hb_shutdown_slot() and o2hb_check_slot(), since event is defined as
    local, it is only valid during the call stack.  So the following tiny race
    case may happen in a multi-volumes mounted environment:
    
    o2hb-vol1                         o2hb-vol2
    1) o2hb_shutdown_slot
    allocate local event1
    2) queue_node_event
    add event1 to global o2hb_node_events
                                      3) o2hb_shutdown_slot
                                      allocate local event2
                                      4) queue_node_event
                                      add event2 to global o2hb_node_events
                                      5) o2hb_run_event_list
                                      delete event1 from o2hb_node_events
    6) o2hb_run_event_list
    event1 empty, return
    7) o2hb_shutdown_slot
    event1 lifecycle ends
                                      8) o2hb_fire_callbacks
                                      event1 is already *invalid*
    
    This patch lets it wait on o2hb_callback_sem when another thread is firing
    callbacks.  And for performance consideration, we only call
    o2hb_run_event_list when there is an event queued.
    Signed-off-by: default avatarJoyce <xuejiufei@huawei.com>
    Signed-off-by: default avatarJoseph Qi <joseph.qi@huawei.com>
    Cc: Joel Becker <jlbec@evilplan.org>
    Cc: Mark Fasheh <mfasheh@suse.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    6f8648e8
heartbeat.c 69.2 KB