Commit 3b8118cf authored by Kurt Hackel's avatar Kurt Hackel Committed by Mark Fasheh

ocfs2_dlm: Calling post handler function in assert master handler

This patch prevents the dlm from sending the clear refmap message
before the set refmap. We use the newly created post function handler
routine to accomplish the task.
Signed-off-by: default avatarKurt Hackel <kurt.hackel@oracle.com>
Signed-off-by: default avatarSunil Mushran <sunil.mushran@oracle.com>
Signed-off-by: default avatarMark Fasheh <mark.fasheh@oracle.com>
parent d74c9803
...@@ -224,6 +224,7 @@ static inline void __dlm_set_joining_node(struct dlm_ctxt *dlm, ...@@ -224,6 +224,7 @@ static inline void __dlm_set_joining_node(struct dlm_ctxt *dlm,
#define DLM_LOCK_RES_MIGRATING 0x00000020 #define DLM_LOCK_RES_MIGRATING 0x00000020
#define DLM_LOCK_RES_DROPPING_REF 0x00000040 #define DLM_LOCK_RES_DROPPING_REF 0x00000040
#define DLM_LOCK_RES_BLOCK_DIRTY 0x00001000 #define DLM_LOCK_RES_BLOCK_DIRTY 0x00001000
#define DLM_LOCK_RES_SETREF_INPROG 0x00002000
/* max milliseconds to wait to sync up a network failure with a node death */ /* max milliseconds to wait to sync up a network failure with a node death */
#define DLM_NODE_DEATH_WAIT_MAX (5 * 1000) #define DLM_NODE_DEATH_WAIT_MAX (5 * 1000)
...@@ -879,6 +880,7 @@ int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data, ...@@ -879,6 +880,7 @@ int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data,
void **ret_data); void **ret_data);
int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data, int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
void **ret_data); void **ret_data);
void dlm_assert_master_post_handler(int status, void *data, void *ret_data);
int dlm_deref_lockres_handler(struct o2net_msg *msg, u32 len, void *data, int dlm_deref_lockres_handler(struct o2net_msg *msg, u32 len, void *data,
void **ret_data); void **ret_data);
int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data, int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data,
......
...@@ -1101,7 +1101,8 @@ static int dlm_register_domain_handlers(struct dlm_ctxt *dlm) ...@@ -1101,7 +1101,8 @@ static int dlm_register_domain_handlers(struct dlm_ctxt *dlm)
status = o2net_register_handler(DLM_ASSERT_MASTER_MSG, dlm->key, status = o2net_register_handler(DLM_ASSERT_MASTER_MSG, dlm->key,
sizeof(struct dlm_assert_master), sizeof(struct dlm_assert_master),
dlm_assert_master_handler, dlm_assert_master_handler,
dlm, NULL, &dlm->dlm_domain_handlers); dlm, dlm_assert_master_post_handler,
&dlm->dlm_domain_handlers);
if (status) if (status)
goto bail; goto bail;
......
...@@ -2036,8 +2036,12 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data, ...@@ -2036,8 +2036,12 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
done: done:
ret = 0; ret = 0;
if (res) if (res) {
dlm_lockres_put(res); spin_lock(&res->spinlock);
res->state |= DLM_LOCK_RES_SETREF_INPROG;
spin_unlock(&res->spinlock);
*ret_data = (void *)res;
}
dlm_put(dlm); dlm_put(dlm);
if (master_request) { if (master_request) {
mlog(0, "need to tell master to reassert\n"); mlog(0, "need to tell master to reassert\n");
...@@ -2064,11 +2068,25 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data, ...@@ -2064,11 +2068,25 @@ int dlm_assert_master_handler(struct o2net_msg *msg, u32 len, void *data,
__dlm_print_one_lock_resource(res); __dlm_print_one_lock_resource(res);
spin_unlock(&res->spinlock); spin_unlock(&res->spinlock);
spin_unlock(&dlm->spinlock); spin_unlock(&dlm->spinlock);
dlm_lockres_put(res); *ret_data = (void *)res;
dlm_put(dlm); dlm_put(dlm);
return -EINVAL; return -EINVAL;
} }
void dlm_assert_master_post_handler(int status, void *data, void *ret_data)
{
struct dlm_lock_resource *res = (struct dlm_lock_resource *)ret_data;
if (ret_data) {
spin_lock(&res->spinlock);
res->state &= ~DLM_LOCK_RES_SETREF_INPROG;
spin_unlock(&res->spinlock);
wake_up(&res->wq);
dlm_lockres_put(res);
}
return;
}
int dlm_dispatch_assert_master(struct dlm_ctxt *dlm, int dlm_dispatch_assert_master(struct dlm_ctxt *dlm,
struct dlm_lock_resource *res, struct dlm_lock_resource *res,
int ignore_higher, u8 request_from, u32 flags) int ignore_higher, u8 request_from, u32 flags)
......
...@@ -176,6 +176,10 @@ static int dlm_purge_lockres(struct dlm_ctxt *dlm, ...@@ -176,6 +176,10 @@ static int dlm_purge_lockres(struct dlm_ctxt *dlm,
res->lockname.name, master); res->lockname.name, master);
if (!master) { if (!master) {
spin_lock(&res->spinlock);
/* This ensures that clear refmap is sent after the set */
__dlm_wait_on_lockres_flags(res, DLM_LOCK_RES_SETREF_INPROG);
spin_unlock(&res->spinlock);
/* drop spinlock to do messaging, retake below */ /* drop spinlock to do messaging, retake below */
spin_unlock(&dlm->spinlock); spin_unlock(&dlm->spinlock);
/* clear our bit from the master's refmap, ignore errors */ /* clear our bit from the master's refmap, ignore errors */
......
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