Commit c24f72cc authored by Joel Becker's avatar Joel Becker Committed by Mark Fasheh

ocfs2: Proper cleanup in case of error in ocfs2_register_hb_callbacks()

If ocfs2_register_hb_callbacks() succeeds on its first callback but fails
its second, it doesn't release the first on the way out. Fix that.

While we're at it, o2hb_unregister_callback() never returns anything but
0, so let's make it void.
Signed-off-by: default avatarJoel Becker <joel.becker@oracle.com>
Signed-off-by: default avatarMark Fasheh <mark.fasheh@oracle.com>
parent c3442e29
...@@ -1682,7 +1682,7 @@ int o2hb_register_callback(struct o2hb_callback_func *hc) ...@@ -1682,7 +1682,7 @@ int o2hb_register_callback(struct o2hb_callback_func *hc)
} }
EXPORT_SYMBOL_GPL(o2hb_register_callback); EXPORT_SYMBOL_GPL(o2hb_register_callback);
int o2hb_unregister_callback(struct o2hb_callback_func *hc) void o2hb_unregister_callback(struct o2hb_callback_func *hc)
{ {
BUG_ON(hc->hc_magic != O2HB_CB_MAGIC); BUG_ON(hc->hc_magic != O2HB_CB_MAGIC);
...@@ -1690,15 +1690,13 @@ int o2hb_unregister_callback(struct o2hb_callback_func *hc) ...@@ -1690,15 +1690,13 @@ int o2hb_unregister_callback(struct o2hb_callback_func *hc)
__builtin_return_address(0), hc); __builtin_return_address(0), hc);
if (list_empty(&hc->hc_item)) if (list_empty(&hc->hc_item))
return 0; return;
down_write(&o2hb_callback_sem); down_write(&o2hb_callback_sem);
list_del_init(&hc->hc_item); list_del_init(&hc->hc_item);
up_write(&o2hb_callback_sem); up_write(&o2hb_callback_sem);
return 0;
} }
EXPORT_SYMBOL_GPL(o2hb_unregister_callback); EXPORT_SYMBOL_GPL(o2hb_unregister_callback);
......
...@@ -70,7 +70,7 @@ void o2hb_setup_callback(struct o2hb_callback_func *hc, ...@@ -70,7 +70,7 @@ void o2hb_setup_callback(struct o2hb_callback_func *hc,
void *data, void *data,
int priority); int priority);
int o2hb_register_callback(struct o2hb_callback_func *hc); int o2hb_register_callback(struct o2hb_callback_func *hc);
int o2hb_unregister_callback(struct o2hb_callback_func *hc); void o2hb_unregister_callback(struct o2hb_callback_func *hc);
void o2hb_fill_node_map(unsigned long *map, void o2hb_fill_node_map(unsigned long *map,
unsigned bytes); unsigned bytes);
void o2hb_init(void); void o2hb_init(void);
......
...@@ -1638,17 +1638,8 @@ static void o2net_hb_node_up_cb(struct o2nm_node *node, int node_num, ...@@ -1638,17 +1638,8 @@ static void o2net_hb_node_up_cb(struct o2nm_node *node, int node_num,
void o2net_unregister_hb_callbacks(void) void o2net_unregister_hb_callbacks(void)
{ {
int ret; o2hb_unregister_callback(&o2net_hb_up);
o2hb_unregister_callback(&o2net_hb_down);
ret = o2hb_unregister_callback(&o2net_hb_up);
if (ret < 0)
mlog(ML_ERROR, "Status return %d unregistering heartbeat up "
"callback!\n", ret);
ret = o2hb_unregister_callback(&o2net_hb_down);
if (ret < 0)
mlog(ML_ERROR, "Status return %d unregistering heartbeat down "
"callback!\n", ret);
} }
int o2net_register_hb_callbacks(void) int o2net_register_hb_callbacks(void)
......
...@@ -164,8 +164,10 @@ int ocfs2_register_hb_callbacks(struct ocfs2_super *osb) ...@@ -164,8 +164,10 @@ int ocfs2_register_hb_callbacks(struct ocfs2_super *osb)
} }
status = o2hb_register_callback(&osb->osb_hb_up); status = o2hb_register_callback(&osb->osb_hb_up);
if (status < 0) if (status < 0) {
mlog_errno(status); mlog_errno(status);
o2hb_unregister_callback(&osb->osb_hb_down);
}
bail: bail:
return status; return status;
...@@ -173,18 +175,11 @@ int ocfs2_register_hb_callbacks(struct ocfs2_super *osb) ...@@ -173,18 +175,11 @@ int ocfs2_register_hb_callbacks(struct ocfs2_super *osb)
void ocfs2_clear_hb_callbacks(struct ocfs2_super *osb) void ocfs2_clear_hb_callbacks(struct ocfs2_super *osb)
{ {
int status;
if (ocfs2_mount_local(osb)) if (ocfs2_mount_local(osb))
return; return;
status = o2hb_unregister_callback(&osb->osb_hb_down); o2hb_unregister_callback(&osb->osb_hb_down);
if (status < 0) o2hb_unregister_callback(&osb->osb_hb_up);
mlog_errno(status);
status = o2hb_unregister_callback(&osb->osb_hb_up);
if (status < 0)
mlog_errno(status);
} }
void ocfs2_stop_heartbeat(struct ocfs2_super *osb) void ocfs2_stop_heartbeat(struct ocfs2_super *osb)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment