ocfs2: Introduce the new ocfs2_cluster_connect/disconnect() API.
This step introduces a cluster stack agnostic API for initializing and exiting. fs/ocfs2/dlmglue.c no longer uses o2cb/o2dlm knowledge to connect to the stack. It is all handled in stackglue.c. heartbeat.c no longer needs to know how it gets called. ocfs2_do_node_down() is now a clean recovery trigger. The big gotcha is the ordering of initializations and de-initializations done underneath ocfs2_cluster_connect(). ocfs2_dlm_init() used to do all o2dlm initialization in one block. Thus, the o2dlm functionality of ocfs2_cluster_connect() is very straightforward. ocfs2_dlm_shutdown(), however, did a few things between de-registration of the eviction callback and actually shutting down the domain. Now de-registration and shutdown of the domain are wrapped within the single ocfs2_cluster_disconnect() call. I've checked the code paths to make sure we can safely tear down things in ocfs2_dlm_shutdown() before calling ocfs2_cluster_disconnect(). The filesystem has already set itself to ignore the callback. Signed-off-by: Joel Becker <joel.becker@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
@@ -32,9 +32,22 @@
|
||||
*/
|
||||
#define DLM_LKF_LOCAL 0x00100000
|
||||
|
||||
/*
|
||||
* This shadows DLM_LOCKSPACE_LEN in fs/dlm/dlm_internal.h. That probably
|
||||
* wants to be in a public header.
|
||||
*/
|
||||
#define GROUP_NAME_MAX 64
|
||||
|
||||
|
||||
#include "dlm/dlmapi.h"
|
||||
|
||||
struct ocfs2_protocol_version {
|
||||
u8 pv_major;
|
||||
u8 pv_minor;
|
||||
};
|
||||
|
||||
struct ocfs2_locking_protocol {
|
||||
struct ocfs2_protocol_version lp_max_version;
|
||||
void (*lp_lock_ast)(void *astarg);
|
||||
void (*lp_blocking_ast)(void *astarg, int level);
|
||||
void (*lp_unlock_ast)(void *astarg, int error);
|
||||
@@ -44,14 +57,32 @@ union ocfs2_dlm_lksb {
|
||||
struct dlm_lockstatus lksb_o2dlm;
|
||||
};
|
||||
|
||||
int ocfs2_dlm_lock(struct dlm_ctxt *dlm,
|
||||
struct ocfs2_cluster_connection {
|
||||
char cc_name[GROUP_NAME_MAX];
|
||||
int cc_namelen;
|
||||
struct ocfs2_protocol_version cc_version;
|
||||
void (*cc_recovery_handler)(int node_num, void *recovery_data);
|
||||
void *cc_recovery_data;
|
||||
void *cc_lockspace;
|
||||
void *cc_private;
|
||||
};
|
||||
|
||||
int ocfs2_cluster_connect(const char *group,
|
||||
int grouplen,
|
||||
void (*recovery_handler)(int node_num,
|
||||
void *recovery_data),
|
||||
void *recovery_data,
|
||||
struct ocfs2_cluster_connection **conn);
|
||||
int ocfs2_cluster_disconnect(struct ocfs2_cluster_connection *conn);
|
||||
|
||||
int ocfs2_dlm_lock(struct ocfs2_cluster_connection *conn,
|
||||
int mode,
|
||||
union ocfs2_dlm_lksb *lksb,
|
||||
u32 flags,
|
||||
void *name,
|
||||
unsigned int namelen,
|
||||
void *astarg);
|
||||
int ocfs2_dlm_unlock(struct dlm_ctxt *dlm,
|
||||
int ocfs2_dlm_unlock(struct ocfs2_cluster_connection *conn,
|
||||
union ocfs2_dlm_lksb *lksb,
|
||||
u32 flags,
|
||||
void *astarg);
|
||||
|
Reference in New Issue
Block a user