Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −4
Original line number Diff line number Diff line
@@ -1682,7 +1682,7 @@ int o2hb_register_callback(struct o2hb_callback_func *hc)
}
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);

@@ -1690,15 +1690,13 @@ int o2hb_unregister_callback(struct o2hb_callback_func *hc)
	     __builtin_return_address(0), hc);

	if (list_empty(&hc->hc_item))
		return 0;
		return;

	down_write(&o2hb_callback_sem);

	list_del_init(&hc->hc_item);

	up_write(&o2hb_callback_sem);

	return 0;
}
EXPORT_SYMBOL_GPL(o2hb_unregister_callback);

+1 −1
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ void o2hb_setup_callback(struct o2hb_callback_func *hc,
			 void *data,
			 int priority);
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,
			unsigned bytes);
void o2hb_init(void);
+2 −11
Original line number Diff line number Diff line
@@ -1638,17 +1638,8 @@ static void o2net_hb_node_up_cb(struct o2nm_node *node, int node_num,

void o2net_unregister_hb_callbacks(void)
{
	int ret;

	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);
	o2hb_unregister_callback(&o2net_hb_up);
	o2hb_unregister_callback(&o2net_hb_down);
}

int o2net_register_hb_callbacks(void)
+5 −10
Original line number Diff line number Diff line
@@ -164,8 +164,10 @@ int ocfs2_register_hb_callbacks(struct ocfs2_super *osb)
	}

	status = o2hb_register_callback(&osb->osb_hb_up);
	if (status < 0)
	if (status < 0) {
		mlog_errno(status);
		o2hb_unregister_callback(&osb->osb_hb_down);
	}

bail:
	return status;
@@ -173,18 +175,11 @@ int ocfs2_register_hb_callbacks(struct ocfs2_super *osb)

void ocfs2_clear_hb_callbacks(struct ocfs2_super *osb)
{
	int status;

	if (ocfs2_mount_local(osb))
		return;

	status = o2hb_unregister_callback(&osb->osb_hb_down);
	if (status < 0)
		mlog_errno(status);

	status = o2hb_unregister_callback(&osb->osb_hb_up);
	if (status < 0)
		mlog_errno(status);
	o2hb_unregister_callback(&osb->osb_hb_down);
	o2hb_unregister_callback(&osb->osb_hb_up);
}

void ocfs2_stop_heartbeat(struct ocfs2_super *osb)