[Ocfs2-devel] [PATCH] ocfs2: dlmlock_master should return DLM_NORMAL after adding lock to blocked list
Andrew Morton
akpm at linux-foundation.org
Fri Jun 28 13:47:49 PDT 2013
On Sun, 23 Jun 2013 18:39:16 +0800 Jeff Liu <jeff.liu at oracle.com> wrote:
> Hi Jiufei,
>
> On 06/20/2013 07:13 PM, Xue jiufei wrote:
>
> > Function dlmlock_master() returns DLM_RECOVERING/DLM_MIGRATING/
> > DLM_FORWAR after adding lock to blocked list if lockres has the state
> > DLM_LOCK_RES_RECOVERING/DLM_LOCK_RES_MIGRATING/
> > DLM_LOCK_RES_IN_PROGRESS. so it will retry in dlmlock(). And this may
> > cause dlm_thread fall into an infinite loop
> >
> > Thread1 dlm_thread
> > calls dlm_lock->dlmlock_master,
> > if lockresA is in state
> > DLM_LOCK_RES_RECOVERING, calls
> > __dlm_wait_on_lockres() and waits
> > until others threads clear this
> > state;
> >
> > If cannot grant this lock,
> > adding lock to blocked list,
> > and return DLM_RECOVERING;
> >
> > Grant this lock and move it to
> > grant list;
> >
> > After a while, retry and
> > calls list_add_tail(), adding lock
> > to blocked list again.
> >
> > Granted and blocked list of this lockres will become the following
> > conditions:
> > lock_res->granted.next = dlm_lock->list_head;
> > lock_res->blocked.next = dlm_lock->list_head;
> > dlm_lock->list_head.next = dlm_lock_resource->blocked;
> > When dlm_thread traverses the granted list, it will fall into an
> > endless loop, checking dlm_lock.list_head, dlm_lock->list_head.next
> > (i.e.lock_res->blocked), lock_res->blocked.next(i.e.dlm_lock.list_head
> > again) .....
>
> Thanks for your nice description of this problem and this fix looks good.
> Let's waiting for an ACK from either Sunil, Mark or Joel.
Still waiting ;)
From: Xue jiufei <xuejiufei at huawei.com>
Subject: ocfs2: dlmlock_master() should return DLM_NORMAL after adding lock to blocked list
dlmlock_master() returns DLM_RECOVERING/DLM_MIGRATING/ DLM_FORWAR after
adding lock to blocked list if lockres has the state
DLM_LOCK_RES_RECOVERING/DLM_LOCK_RES_MIGRATING/ DLM_LOCK_RES_IN_PROGRESS.
so it will retry in dlmlock(). And this may cause dlm_thread fall into an
infinite loop
Thread1 dlm_thread
calls dlm_lock->dlmlock_master,
if lockresA is in state
DLM_LOCK_RES_RECOVERING, calls
__dlm_wait_on_lockres() and waits
until others threads clear this
state;
If cannot grant this lock,
adding lock to blocked list,
and return DLM_RECOVERING;
Grant this lock and move it to
grant list;
After a while, retry and
calls list_add_tail(), adding lock
to blocked list again.
Granted and blocked list of this lockres will become the following
conditions:
lock_res->granted.next = dlm_lock->list_head;
lock_res->blocked.next = dlm_lock->list_head;
dlm_lock->list_head.next = dlm_lock_resource->blocked;
When dlm_thread traverses the granted list, it will fall into an endless
loop, checking dlm_lock.list_head, dlm_lock->list_head.next
(i.e.lock_res->blocked), lock_res->blocked.next(i.e.dlm_lock.list_head
again) .....
Signed-off-by: joyce <xuejiufei at huawei.com>
Reviewed-by: jensen <shencanquan at huawei.com>
Cc: Jeff Liu <jeff.liu at oracle.com>
Cc: Sunil Mushran <sunil.mushran at gmail.com>
Cc: Mark Fasheh <mfasheh at suse.com>
Cc: Joel Becker <jlbec at evilplan.org>
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
---
fs/ocfs2/dlm/dlmlock.c | 1 +
1 file changed, 1 insertion(+)
diff -puN fs/ocfs2/dlm/dlmlock.c~ocfs2-dlmlock_master-should-return-dlm_normal-after-adding-lock-to-blocked-list fs/ocfs2/dlm/dlmlock.c
--- a/fs/ocfs2/dlm/dlmlock.c~ocfs2-dlmlock_master-should-return-dlm_normal-after-adding-lock-to-blocked-list
+++ a/fs/ocfs2/dlm/dlmlock.c
@@ -178,6 +178,7 @@ static enum dlm_status dlmlock_master(st
lock->ml.node);
}
} else {
+ status = DLM_NORMAL;
dlm_lock_get(lock);
list_add_tail(&lock->list, &res->blocked);
kick_thread = 1;
_
More information about the Ocfs2-devel
mailing list