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: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
parent
c3442e2965
commit
c24f72cc7c
4 changed files with 10 additions and 26 deletions
|
@ -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)
|
||||||
__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,
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
|
|
Loading…
Add table
Reference in a new issue