summaryrefslogtreecommitdiff
path: root/fs/ocfs2/ocfs2_lockid.h
diff options
context:
space:
mode:
authorXue jiufei <xuejiufei@huawei.com>2013-07-03 22:00:56 (GMT)
committerLinus Torvalds <torvalds@linux-foundation.org>2013-07-03 23:07:24 (GMT)
commit096b2ef83c87d7a7e0d2838f7f1391c74fdad0e6 (patch)
tree661f8dae7e39d15e728231038eb1f2485ea949b0 /fs/ocfs2/ocfs2_lockid.h
parentb30f14c490d0e3ff1b7c0952ccd343408557484e (diff)
downloadlinux-fsl-qoriq-096b2ef83c87d7a7e0d2838f7f1391c74fdad0e6.tar.xz
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@huawei.com> Reviewed-by: jensen <shencanquan@huawei.com> Cc: Jeff Liu <jeff.liu@oracle.com> Acked-by: Sunil Mushran <sunil.mushran@gmail.com> Cc: Mark Fasheh <mfasheh@suse.com> Cc: Joel Becker <jlbec@evilplan.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/ocfs2/ocfs2_lockid.h')
0 files changed, 0 insertions, 0 deletions