diff options
author | Wengang Wang <wen.gang.wang@oracle.com> | 2010-05-17 08:20:44 -0400 |
---|---|---|
committer | Joel Becker <joel.becker@oracle.com> | 2010-05-18 19:41:34 -0400 |
commit | d9ef75221a6247b758e1d7e18edb661996e4b7cf (patch) | |
tree | a1a1355da23b7448afdc851f7a211f2b3492d6e5 /fs/ocfs2/dlm/dlmast.c | |
parent | d5a7df0649fa6a1e7800785d760e2c7d7a3204de (diff) |
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.c | 4 |
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) | |||
89 | return 0; | 89 | return 0; |
90 | } | 90 | } |
91 | 91 | ||
92 | static void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) | 92 | void __dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) |
93 | { | 93 | { |
94 | mlog_entry_void(); | 94 | mlog_entry_void(); |
95 | 95 | ||
@@ -146,7 +146,7 @@ void dlm_queue_ast(struct dlm_ctxt *dlm, struct dlm_lock *lock) | |||
146 | } | 146 | } |
147 | 147 | ||
148 | 148 | ||
149 | static void __dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) | 149 | void __dlm_queue_bast(struct dlm_ctxt *dlm, struct dlm_lock *lock) |
150 | { | 150 | { |
151 | mlog_entry_void(); | 151 | mlog_entry_void(); |
152 | 152 | ||