Commit cb79662b authored by Srinivas Eeda's avatar Srinivas Eeda Committed by Linus Torvalds

ocfs2: o2dlm: fix a race between purge and master query

Node A sends master query request to node B which is the master.  At this
time lockres happens to be on purgelist.  dlm_master_request_handler gets
the dlm spinlock, finds the resource and releases the dlm spin lock.
Right at this dlm_thread on this node could purge the lockres.
dlm_master_request_handler can then acquire lockres spinlock and reply to
Node A that node B is the master even though lockres on node B is purged.

The above scenario will now make node A falsely think node B is the master
which is inconsistent.  Further if another node C tries to master the same
resource, every node will respond they are not the master.  Node C then
masters the resource and sends assert master to all nodes.  This will now
make node A crash with the following message.

dlm_assert_master_handler:1831 ERROR: DIE! Mastery assert from 9, but current
owner is 10!
Signed-off-by: default avatarSrinivas Eeda <>
Cc: Mark Fasheh <>
Cc: Joel Becker <>
Reviewed-by: default avatarWengang Wang <>
Tested-by: default avatarJoseph Qi <>
Signed-off-by: default avatarAndrew Morton <>
Signed-off-by: default avatarLinus Torvalds <>
parent f5425fce
......@@ -1460,6 +1460,18 @@ int dlm_master_request_handler(struct o2net_msg *msg, u32 len, void *data,
/* take care of the easy cases up front */
* Right after dlm spinlock was released, dlm_thread could have
* purged the lockres. Check if lockres got unhashed. If so
* start over.
if (hlist_unhashed(&res->hash_node)) {
goto way_up_top;
if (res->state & (DLM_LOCK_RES_RECOVERING|
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