ocfs2: live heartbeat depends on the local node configuration
Removing the local node configuration out from underneath a running heartbeat is "bad". Provide an API in the ocfs2 nodemanager to request a configfs dependancy on the local node, then use it in heartbeat. Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
parent
14829422be
commit
16c6a4f24d
3 changed files with 46 additions and 3 deletions
|
@ -1693,9 +1693,18 @@ static int o2hb_region_get(const char *region_uuid)
|
|||
ret = -ENOENT;
|
||||
spin_unlock(&o2hb_live_lock);
|
||||
|
||||
if (!ret)
|
||||
ret = o2nm_depend_item(®->hr_item);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = o2nm_depend_this_node();
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = o2nm_depend_item(®->hr_item);
|
||||
if (ret)
|
||||
o2nm_undepend_this_node();
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -1709,8 +1718,10 @@ static void o2hb_region_put(const char *region_uuid)
|
|||
|
||||
spin_unlock(&o2hb_live_lock);
|
||||
|
||||
if (reg)
|
||||
if (reg) {
|
||||
o2nm_undepend_item(®->hr_item);
|
||||
o2nm_undepend_this_node();
|
||||
}
|
||||
}
|
||||
|
||||
int o2hb_register_callback(const char *region_uuid,
|
||||
|
|
|
@ -910,6 +910,36 @@ void o2nm_undepend_item(struct config_item *item)
|
|||
configfs_undepend_item(&o2nm_cluster_group.cs_subsys, item);
|
||||
}
|
||||
|
||||
int o2nm_depend_this_node(void)
|
||||
{
|
||||
int ret = 0;
|
||||
struct o2nm_node *local_node;
|
||||
|
||||
local_node = o2nm_get_node_by_num(o2nm_this_node());
|
||||
if (!local_node) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = o2nm_depend_item(&local_node->nd_item);
|
||||
o2nm_node_put(local_node);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
void o2nm_undepend_this_node(void)
|
||||
{
|
||||
struct o2nm_node *local_node;
|
||||
|
||||
local_node = o2nm_get_node_by_num(o2nm_this_node());
|
||||
BUG_ON(!local_node);
|
||||
|
||||
o2nm_undepend_item(&local_node->nd_item);
|
||||
o2nm_node_put(local_node);
|
||||
}
|
||||
|
||||
|
||||
static void __exit exit_o2nm(void)
|
||||
{
|
||||
if (ocfs2_table_header)
|
||||
|
|
|
@ -79,5 +79,7 @@ void o2nm_node_put(struct o2nm_node *node);
|
|||
|
||||
int o2nm_depend_item(struct config_item *item);
|
||||
void o2nm_undepend_item(struct config_item *item);
|
||||
int o2nm_depend_this_node(void);
|
||||
void o2nm_undepend_this_node(void);
|
||||
|
||||
#endif /* O2CLUSTER_NODEMANAGER_H */
|
||||
|
|
Loading…
Reference in a new issue