summaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/dlm/dlmast.c
diff options
context:
space:
mode:
authorWengang Wang2010-05-17 14:20:44 +0200
committerJoel Becker2010-05-19 01:41:34 +0200
commitd9ef75221a6247b758e1d7e18edb661996e4b7cf (patch)
treea1a1355da23b7448afdc851f7a211f2b3492d6e5 /fs/ocfs2/dlm/dlmast.c
parentocfs2: Reset xattr value size after xa_cleanup_value_truncate(). (diff)
downloadkernel-qcow2-linux-d9ef75221a6247b758e1d7e18edb661996e4b7cf.tar.gz
kernel-qcow2-linux-d9ef75221a6247b758e1d7e18edb661996e4b7cf.tar.xz
kernel-qcow2-linux-d9ef75221a6247b758e1d7e18edb661996e4b7cf.zip
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>
Diffstat (limited to 'fs/ocfs2/dlm/dlmast.c')
-rw-r--r--fs/ocfs2/dlm/dlmast.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ocfs2/dlm/dlmast.c b/fs/ocfs2/dlm/dlmast.c
index 390a887c4df3..7ec61d91b6a4 100644
--- a/fs/ocfs2/dlm/dlmast.c
+++ b/fs/ocfs2/dlm/dlmast.c
@@ -89,7 +89,7 @@ static int dlm_should_cancel_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock)
return 0;
}
-static void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock)
+void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock)
{
mlog_entry_void();
@@ -146,7 +146,7 @@ void dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock)
}
-static void __dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock)
+void __dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock)
{
mlog_entry_void();