Commit cbe0e331fdbdb256943499358c75bc098a2134c1

Authored by Joel Becker
1 parent 0016eedc41

ocfs2_dlmfs: Enable the use of user cluster stacks.

Unlike ocfs2, dlmfs has no permanent storage.  It can't store off a
cluster stack it is supposed to be using.  So it can't specify the stack
name in ocfs2_cluster_connect().

Instead, we create ocfs2_cluster_connect_agnostic(), which simply uses
the stack that is currently enabled.  This is find for dlmfs, which will
rely on the stack initialization.

We add the "stackglue" capability to dlmfs's capability list.  This lets
userspace know dlmfs can be used with all cluster stacks.

Signed-off-by: Joel Becker <joel.becker@oracle.com>

Showing 5 changed files with 36 additions and 5 deletions Side-by-side Diff

fs/ocfs2/dlmfs/dlmfs.c
... ... @@ -87,7 +87,7 @@
87 87 * - bast : POLLIN against the file descriptor of a held lock
88 88 * signifies a bast fired on the lock.
89 89 */
90   -#define DLMFS_CAPABILITIES "bast"
  90 +#define DLMFS_CAPABILITIES "bast stackglue"
91 91 extern int param_set_dlmfs_capabilities(const char *val,
92 92 struct kernel_param *kp)
93 93 {
fs/ocfs2/dlmfs/userdlm.c
... ... @@ -666,10 +666,10 @@
666 666 int rc;
667 667 struct ocfs2_cluster_connection *conn;
668 668  
669   - rc = ocfs2_cluster_connect("o2cb", name->name, name->len,
670   - &user_dlm_lproto,
671   - user_dlm_recovery_handler_noop,
672   - NULL, &conn);
  669 + rc = ocfs2_cluster_connect_agnostic(name->name, name->len,
  670 + &user_dlm_lproto,
  671 + user_dlm_recovery_handler_noop,
  672 + NULL, &conn);
673 673 if (rc)
674 674 mlog_errno(rc);
675 675  
fs/ocfs2/ocfs2_lockingver.h
... ... @@ -23,6 +23,8 @@
23 23 /*
24 24 * The protocol version for ocfs2 cluster locking. See dlmglue.c for
25 25 * more details.
  26 + *
  27 + * 1.0 - Initial locking version from ocfs2 1.4.
26 28 */
27 29 #define OCFS2_LOCKING_PROTOCOL_MAJOR 1
28 30 #define OCFS2_LOCKING_PROTOCOL_MINOR 0
fs/ocfs2/stackglue.c
... ... @@ -373,6 +373,24 @@
373 373 }
374 374 EXPORT_SYMBOL_GPL(ocfs2_cluster_connect);
375 375  
  376 +/* The caller will ensure all nodes have the same cluster stack */
  377 +int ocfs2_cluster_connect_agnostic(const char *group,
  378 + int grouplen,
  379 + struct ocfs2_locking_protocol *lproto,
  380 + void (*recovery_handler)(int node_num,
  381 + void *recovery_data),
  382 + void *recovery_data,
  383 + struct ocfs2_cluster_connection **conn)
  384 +{
  385 + char *stack_name = NULL;
  386 +
  387 + if (cluster_stack_name[0])
  388 + stack_name = cluster_stack_name;
  389 + return ocfs2_cluster_connect(stack_name, group, grouplen, lproto,
  390 + recovery_handler, recovery_data, conn);
  391 +}
  392 +EXPORT_SYMBOL_GPL(ocfs2_cluster_connect_agnostic);
  393 +
376 394 /* If hangup_pending is 0, the stack driver will be dropped */
377 395 int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn,
378 396 int hangup_pending)
fs/ocfs2/stackglue.h
... ... @@ -246,6 +246,17 @@
246 246 void *recovery_data),
247 247 void *recovery_data,
248 248 struct ocfs2_cluster_connection **conn);
  249 +/*
  250 + * Used by callers that don't store their stack name. They must ensure
  251 + * all nodes have the same stack.
  252 + */
  253 +int ocfs2_cluster_connect_agnostic(const char *group,
  254 + int grouplen,
  255 + struct ocfs2_locking_protocol *lproto,
  256 + void (*recovery_handler)(int node_num,
  257 + void *recovery_data),
  258 + void *recovery_data,
  259 + struct ocfs2_cluster_connection **conn);
249 260 int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn,
250 261 int hangup_pending);
251 262 void ocfs2_cluster_hangup(const char *group, int grouplen);