ocfs2:dlm: avoid dlm->ast_lock lockres->spinlock dependency break
authorWengang Wang <wen.gang.wang@oracle.com>
Mon, 17 May 2010 12:20:44 +0000 (20:20 +0800)
committerJoel Becker <joel.becker@oracle.com>
Tue, 18 May 2010 23:41:34 +0000 (16:41 -0700)
commitd9ef75221a6247b758e1d7e18edb661996e4b7cf
treea1a1355da23b7448afdc851f7a211f2b3492d6e5
parentd5a7df0649fa6a1e7800785d760e2c7d7a3204de
ocfs2:dlm: avoid dlm->ast_lock lockres->spinlock dependency break

Currently we process a dirty lockres with the lockres->spinlock taken. While
during the process, we may need to lock on dlm->ast_lock. This breaks the
dependency of dlm->ast_lock(lock first) and lockres->spinlock(lock second).

This patch fixes the problem.
Since we can't release lockres->spinlock, we have to take dlm->ast_lock
just before taking the lockres->spinlock and release it after lockres->spinlock
is released. And use __dlm_queue_bast()/__dlm_queue_ast(), the nolock version,
in dlm_shuffle_lists(). There are no too many locks on a lockres, so there is no
performance harm.

Signed-off-by: Wengang Wang <wen.gang.wang@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
fs/ocfs2/dlm/dlmast.c
fs/ocfs2/dlm/dlmcommon.h
fs/ocfs2/dlm/dlmthread.c