ocfs2: fix a tiny race case when fire callbacks
PATCH 1/1 ocfs2: fix a tiny race case when fire callbacks
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 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.
--- fs/ocfs2/cluster/heartbeat.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
fs/ocfs2/cluster/heartbeat.c +9 -9
@@ -641,16 +641,9 @@ static void o2hb_fire_callbacks(struct o2hb_callback *hbcall,/* Will run the list in order until we process the passed event */ static void o2hb_run_event_list (struct o2hb_node_event *queued_event) { -int empty;struct o2hb_callback *hbcall;struct o2hb_node_event *event; -spin_lock (&o2hb_live_lock); - empty =list_empty (&queued_event->hn_item); -spin_unlock (&o2hb_live_lock); -if (empty) -return ; -/* Holding callback sem assures we don't alter the callback * lists when doing this, and serializes ourselves with other * processes wanting callbacks. */
@@ -709,6 +702,7 @@ static void o2hb_shutdown_slot(struct o2hb_disk_slot *slot)struct o2hb_node_event event = { .hn_item =LIST_HEAD_INIT (event.hn_item), };struct o2nm_node *node; +int queued =0 ; node =o2nm_get_node_by_num (slot->ds_node_num);if (!node)
@@ -726,11 +720,13 @@ static void o2hb_shutdown_slot(struct o2hb_disk_slot *slot)o2hb_queue_node_event (&event,O2HB_NODE_DOWN_CB , node, slot->ds_node_num); + queued =1 ; } }spin_unlock (&o2hb_live_lock); -o2hb_run_event_list (&event); +if (queued) +o2hb_run_event_list (&event);o2nm_node_put (node); }
@@ -790,6 +786,7 @@ static int o2hb_check_slot(struct o2hb_region *reg,unsigned int dead_ms = o2hb_dead_threshold *O2HB_REGION_TIMEOUT_MS ;unsigned int slot_dead_ms;int tmp; +int queued =0 ;memcpy (hb_block, slot->ds_raw_block, reg->hr_block_bytes);
@@ -883,6 +880,7 @@ fire_callbacks: slot->ds_node_num); changed =1 ; + queued =1 ; } list_add_tail(&slot->ds_live_item,
@@ -934,6 +932,7 @@ fire_callbacks: node, slot->ds_node_num); changed =1 ; + queued =1 ; }/* We don't clear this because the node is still
@@ -949,7 +948,8 @@ fire_callbacks: out:spin_unlock (&o2hb_live_lock); -o2hb_run_event_list (&event); +if (queued) +o2hb_run_event_list (&event);if (node)o2nm_node_put (node);
-- 1.7.9.7
PATCH 1/1 ocfs2: fix a tiny race case when fire callbacks
Quoted 2 lines · On Tue, 27 Aug 2013 14:17:17 +0800 Joseph Qi <[email protected]> wrote:
Signed-off-by Joyce <[email protected]>Signed-off-by Joseph Qi <[email protected]>
This signoff trail makes me wonder: which of you was the primary author of this patch?
PATCH 1/1 ocfs2: fix a tiny race case when fire callbacks
Quoted 9 lines · Andrew Morton
Quoted 2 lines · On Tue, 27 Aug 2013 14:17:17 +0800 Joseph Qi <[email protected]> wrote:
Signed-off-by Joyce <[email protected]>Signed-off-by Joseph Qi <[email protected]>This signoff trail makes me wonder: which of you was the primary author of this patch?
Sorry for the misleading signoff trail. Joyce fixed this bug and I rearranged the patch and sent it.
Please refer Joyce as the primary author, thanks.
PATCH 1/1 ocfs2: fix a tiny race case when fire callbacks
Quoted 6 lines · On Wed, 28 Aug 2013 09:59:21 +0800 Joseph Qi <[email protected]> wrote:
Quoted 5 lines · Andrew Morton
Quoted 2 lines · On Tue, 27 Aug 2013 14:17:17 +0800 Joseph Qi <[email protected]> wrote:
Signed-off-by Joyce <[email protected]>Signed-off-by Joseph Qi <[email protected]>
Quoted 7 lines
Quoted 4 lines
This signoff trail makes me wonder: which of you was the primary author of this patch?
Sorry for the misleading signoff trail. Joyce fixed this bug and I rearranged the patch and sent it.
Please refer Joyce as the primary author, thanks.
No problems. Damn, am I good, or what ;)
The way to handle this situation is to put an explicit From:Joyce line at the very start of the changelog. If that is present, the person who receives the patch should prioritize that From: line over the one which is present in the email envelope.