Commit c74a3bdd authored by Goldwyn Rodrigues's avatar Goldwyn Rodrigues Committed by Linus Torvalds

ocfs2: add clustername to cluster connection

This is an effort of removing ocfs2_controld.pcmk and getting ocfs2 DLM
handling up to the times with respect to DLM (>=4.0.1) and corosync
(2.3.x).  AFAIK, cman also is being phased out for a unified corosync
cluster stack.

fs/dlm performs all the functions with respect to fencing and node
management and provides the API's to do so for ocfs2.  For all future
references, DLM stands for fs/dlm code.

The advantages are:
 + No need to run an additional userspace daemon (ocfs2_controld)
 + No controld device handling and controld protocol
 + Shifting responsibilities of node management to DLM layer

For backward compatibility, we are keeping the controld handling code.
Once enough time has passed we can remove a significant portion of the
code.  This was tested by using the kernel with changes on older
unmodified tools.  The kernel used ocfs2_controld as expected, and
displayed the appropriate warning message.

This feature requires modification in the userspace ocfs2-tools.  The
changes can be found at: https://github.com/goldwynr/ocfs2-tools branch:
nocontrold Currently, not many checks are present in the userspace code,
but that would change soon.

This patch (of 6):

Add clustername to cluster connection.
Signed-off-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
Reviewed-by: default avatarMark Fasheh <mfasheh@suse.de>
Cc: Joel Becker <jlbec@evilplan.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ff8fb335
...@@ -2996,6 +2996,8 @@ int ocfs2_dlm_init(struct ocfs2_super *osb) ...@@ -2996,6 +2996,8 @@ int ocfs2_dlm_init(struct ocfs2_super *osb)
/* for now, uuid == domain */ /* for now, uuid == domain */
status = ocfs2_cluster_connect(osb->osb_cluster_stack, status = ocfs2_cluster_connect(osb->osb_cluster_stack,
osb->osb_cluster_name,
strlen(osb->osb_cluster_name),
osb->uuid_str, osb->uuid_str,
strlen(osb->uuid_str), strlen(osb->uuid_str),
&lproto, ocfs2_do_node_down, osb, &lproto, ocfs2_do_node_down, osb,
......
...@@ -387,6 +387,7 @@ struct ocfs2_super ...@@ -387,6 +387,7 @@ struct ocfs2_super
u8 osb_stackflags; u8 osb_stackflags;
char osb_cluster_stack[OCFS2_STACK_LABEL_LEN + 1]; char osb_cluster_stack[OCFS2_STACK_LABEL_LEN + 1];
char osb_cluster_name[OCFS2_CLUSTER_NAME_LEN + 1];
struct ocfs2_cluster_connection *cconn; struct ocfs2_cluster_connection *cconn;
struct ocfs2_lock_res osb_super_lockres; struct ocfs2_lock_res osb_super_lockres;
struct ocfs2_lock_res osb_rename_lockres; struct ocfs2_lock_res osb_rename_lockres;
......
...@@ -309,6 +309,8 @@ int ocfs2_plock(struct ocfs2_cluster_connection *conn, u64 ino, ...@@ -309,6 +309,8 @@ int ocfs2_plock(struct ocfs2_cluster_connection *conn, u64 ino,
EXPORT_SYMBOL_GPL(ocfs2_plock); EXPORT_SYMBOL_GPL(ocfs2_plock);
int ocfs2_cluster_connect(const char *stack_name, int ocfs2_cluster_connect(const char *stack_name,
const char *cluster_name,
int cluster_name_len,
const char *group, const char *group,
int grouplen, int grouplen,
struct ocfs2_locking_protocol *lproto, struct ocfs2_locking_protocol *lproto,
...@@ -342,8 +344,10 @@ int ocfs2_cluster_connect(const char *stack_name, ...@@ -342,8 +344,10 @@ int ocfs2_cluster_connect(const char *stack_name,
goto out; goto out;
} }
memcpy(new_conn->cc_name, group, grouplen); strlcpy(new_conn->cc_name, group, GROUP_NAME_MAX + 1);
new_conn->cc_namelen = grouplen; new_conn->cc_namelen = grouplen;
strlcpy(new_conn->cc_cluster_name, cluster_name, CLUSTER_NAME_MAX + 1);
new_conn->cc_cluster_name_len = cluster_name_len;
new_conn->cc_recovery_handler = recovery_handler; new_conn->cc_recovery_handler = recovery_handler;
new_conn->cc_recovery_data = recovery_data; new_conn->cc_recovery_data = recovery_data;
...@@ -386,8 +390,9 @@ int ocfs2_cluster_connect_agnostic(const char *group, ...@@ -386,8 +390,9 @@ int ocfs2_cluster_connect_agnostic(const char *group,
if (cluster_stack_name[0]) if (cluster_stack_name[0])
stack_name = cluster_stack_name; stack_name = cluster_stack_name;
return ocfs2_cluster_connect(stack_name, group, grouplen, lproto, return ocfs2_cluster_connect(stack_name, NULL, 0, group, grouplen,
recovery_handler, recovery_data, conn); lproto, recovery_handler, recovery_data,
conn);
} }
EXPORT_SYMBOL_GPL(ocfs2_cluster_connect_agnostic); EXPORT_SYMBOL_GPL(ocfs2_cluster_connect_agnostic);
......
...@@ -45,6 +45,9 @@ struct file_lock; ...@@ -45,6 +45,9 @@ struct file_lock;
*/ */
#define GROUP_NAME_MAX 64 #define GROUP_NAME_MAX 64
/* This shadows OCFS2_CLUSTER_NAME_LEN */
#define CLUSTER_NAME_MAX 16
/* /*
* ocfs2_protocol_version changes when ocfs2 does something different in * ocfs2_protocol_version changes when ocfs2 does something different in
...@@ -97,8 +100,10 @@ struct ocfs2_locking_protocol { ...@@ -97,8 +100,10 @@ struct ocfs2_locking_protocol {
* locking compatibility. * locking compatibility.
*/ */
struct ocfs2_cluster_connection { struct ocfs2_cluster_connection {
char cc_name[GROUP_NAME_MAX]; char cc_name[GROUP_NAME_MAX + 1];
int cc_namelen; int cc_namelen;
char cc_cluster_name[CLUSTER_NAME_MAX + 1];
int cc_cluster_name_len;
struct ocfs2_protocol_version cc_version; struct ocfs2_protocol_version cc_version;
struct ocfs2_locking_protocol *cc_proto; struct ocfs2_locking_protocol *cc_proto;
void (*cc_recovery_handler)(int node_num, void *recovery_data); void (*cc_recovery_handler)(int node_num, void *recovery_data);
...@@ -239,6 +244,8 @@ struct ocfs2_stack_plugin { ...@@ -239,6 +244,8 @@ struct ocfs2_stack_plugin {
/* Used by the filesystem */ /* Used by the filesystem */
int ocfs2_cluster_connect(const char *stack_name, int ocfs2_cluster_connect(const char *stack_name,
const char *cluster_name,
int cluster_name_len,
const char *group, const char *group,
int grouplen, int grouplen,
struct ocfs2_locking_protocol *lproto, struct ocfs2_locking_protocol *lproto,
......
...@@ -2223,10 +2223,9 @@ static int ocfs2_initialize_super(struct super_block *sb, ...@@ -2223,10 +2223,9 @@ static int ocfs2_initialize_super(struct super_block *sb,
if (ocfs2_clusterinfo_valid(osb)) { if (ocfs2_clusterinfo_valid(osb)) {
osb->osb_stackflags = osb->osb_stackflags =
OCFS2_RAW_SB(di)->s_cluster_info.ci_stackflags; OCFS2_RAW_SB(di)->s_cluster_info.ci_stackflags;
memcpy(osb->osb_cluster_stack, strlcpy(osb->osb_cluster_stack,
OCFS2_RAW_SB(di)->s_cluster_info.ci_stack, OCFS2_RAW_SB(di)->s_cluster_info.ci_stack,
OCFS2_STACK_LABEL_LEN); OCFS2_STACK_LABEL_LEN + 1);
osb->osb_cluster_stack[OCFS2_STACK_LABEL_LEN] = '\0';
if (strlen(osb->osb_cluster_stack) != OCFS2_STACK_LABEL_LEN) { if (strlen(osb->osb_cluster_stack) != OCFS2_STACK_LABEL_LEN) {
mlog(ML_ERROR, mlog(ML_ERROR,
"couldn't mount because of an invalid " "couldn't mount because of an invalid "
...@@ -2235,6 +2234,9 @@ static int ocfs2_initialize_super(struct super_block *sb, ...@@ -2235,6 +2234,9 @@ static int ocfs2_initialize_super(struct super_block *sb,
status = -EINVAL; status = -EINVAL;
goto bail; goto bail;
} }
strlcpy(osb->osb_cluster_name,
OCFS2_RAW_SB(di)->s_cluster_info.ci_cluster,
OCFS2_CLUSTER_NAME_LEN + 1);
} else { } else {
/* The empty string is identical with classic tools that /* The empty string is identical with classic tools that
* don't know about s_cluster_info. */ * don't know about s_cluster_info. */
......
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