diff options
| author | Wengang Wang <wen.gang.wang@oracle.com> | 2010-07-30 11:18:00 -0400 |
|---|---|---|
| committer | Joel Becker <joel.becker@oracle.com> | 2010-08-07 13:50:30 -0400 |
| commit | b11f1f1ab73fd358b1b734a9427744802202ba68 (patch) | |
| tree | 4dcb8730d6d448ffa6414e9b8a3589c88e5d823f | |
| parent | a524812b7eaa7783d7811198921100f079034e61 (diff) | |
ocfs2/dlm: remove potential deadlock -V3
When we need to take both dlm_domain_lock and dlm->spinlock, we should take
them in order of: dlm_domain_lock then dlm->spinlock.
There is pathes disobey this order. That is calling dlm_lockres_put() with
dlm->spinlock held in dlm_run_purge_list. dlm_lockres_put() calls dlm_put() at
the ref and dlm_put() locks on dlm_domain_lock.
Fix:
Don't grab/put the dlm when the initialising/releasing lockres.
That grab is not required because we don't call dlm_unregister_domain()
based on refcount.
Signed-off-by: Wengang Wang <wen.gang.wang@oracle.com>
Cc: stable@kernel.org
Signed-off-by: Joel Becker <joel.becker@oracle.com>
| -rw-r--r-- | fs/ocfs2/dlm/dlmmaster.c | 4 |
1 files changed, 0 insertions, 4 deletions
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 6d098b89d46e..ffb4c68dafa4 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
| @@ -511,8 +511,6 @@ static void dlm_lockres_release(struct kref *kref) | |||
| 511 | 511 | ||
| 512 | atomic_dec(&dlm->res_cur_count); | 512 | atomic_dec(&dlm->res_cur_count); |
| 513 | 513 | ||
| 514 | dlm_put(dlm); | ||
| 515 | |||
| 516 | if (!hlist_unhashed(&res->hash_node) || | 514 | if (!hlist_unhashed(&res->hash_node) || |
| 517 | !list_empty(&res->granted) || | 515 | !list_empty(&res->granted) || |
| 518 | !list_empty(&res->converting) || | 516 | !list_empty(&res->converting) || |
| @@ -585,8 +583,6 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm, | |||
| 585 | res->migration_pending = 0; | 583 | res->migration_pending = 0; |
| 586 | res->inflight_locks = 0; | 584 | res->inflight_locks = 0; |
| 587 | 585 | ||
| 588 | /* put in dlm_lockres_release */ | ||
| 589 | dlm_grab(dlm); | ||
| 590 | res->dlm = dlm; | 586 | res->dlm = dlm; |
| 591 | 587 | ||
| 592 | kref_init(&res->refs); | 588 | kref_init(&res->refs); |
