diff options
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/dlm/dlmcommon.h | 3 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmdebug.c | 53 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmdomain.c | 1 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmmaster.c | 10 |
4 files changed, 38 insertions, 29 deletions
diff --git a/fs/ocfs2/dlm/dlmcommon.h b/fs/ocfs2/dlm/dlmcommon.h index d5a86fb81a49..bb53714813ab 100644 --- a/fs/ocfs2/dlm/dlmcommon.h +++ b/fs/ocfs2/dlm/dlmcommon.h | |||
@@ -140,6 +140,7 @@ struct dlm_ctxt | |||
140 | unsigned int purge_count; | 140 | unsigned int purge_count; |
141 | spinlock_t spinlock; | 141 | spinlock_t spinlock; |
142 | spinlock_t ast_lock; | 142 | spinlock_t ast_lock; |
143 | spinlock_t track_lock; | ||
143 | char *name; | 144 | char *name; |
144 | u8 node_num; | 145 | u8 node_num; |
145 | u32 key; | 146 | u32 key; |
@@ -316,6 +317,8 @@ struct dlm_lock_resource | |||
316 | * put on a list for the dlm thread to run. */ | 317 | * put on a list for the dlm thread to run. */ |
317 | unsigned long last_used; | 318 | unsigned long last_used; |
318 | 319 | ||
320 | struct dlm_ctxt *dlm; | ||
321 | |||
319 | unsigned migration_pending:1; | 322 | unsigned migration_pending:1; |
320 | atomic_t asts_reserved; | 323 | atomic_t asts_reserved; |
321 | spinlock_t spinlock; | 324 | spinlock_t spinlock; |
diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c index 1b81dcba175d..b32f60a5acfb 100644 --- a/fs/ocfs2/dlm/dlmdebug.c +++ b/fs/ocfs2/dlm/dlmdebug.c | |||
@@ -630,43 +630,38 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos) | |||
630 | { | 630 | { |
631 | struct debug_lockres *dl = m->private; | 631 | struct debug_lockres *dl = m->private; |
632 | struct dlm_ctxt *dlm = dl->dl_ctxt; | 632 | struct dlm_ctxt *dlm = dl->dl_ctxt; |
633 | struct dlm_lock_resource *oldres = dl->dl_res; | ||
633 | struct dlm_lock_resource *res = NULL; | 634 | struct dlm_lock_resource *res = NULL; |
635 | struct list_head *track_list; | ||
634 | 636 | ||
635 | spin_lock(&dlm->spinlock); | 637 | spin_lock(&dlm->track_lock); |
638 | if (oldres) | ||
639 | track_list = &oldres->tracking; | ||
640 | else | ||
641 | track_list = &dlm->tracking_list; | ||
636 | 642 | ||
637 | if (dl->dl_res) { | 643 | list_for_each_entry(res, track_list, tracking) { |
638 | list_for_each_entry(res, &dl->dl_res->tracking, tracking) { | 644 | if (&res->tracking == &dlm->tracking_list) |
639 | if (dl->dl_res) { | 645 | res = NULL; |
640 | dlm_lockres_put(dl->dl_res); | 646 | else |
641 | dl->dl_res = NULL; | ||
642 | } | ||
643 | if (&res->tracking == &dlm->tracking_list) { | ||
644 | mlog(0, "End of list found, %p\n", res); | ||
645 | dl = NULL; | ||
646 | break; | ||
647 | } | ||
648 | dlm_lockres_get(res); | 647 | dlm_lockres_get(res); |
649 | dl->dl_res = res; | 648 | break; |
650 | break; | ||
651 | } | ||
652 | } else { | ||
653 | if (!list_empty(&dlm->tracking_list)) { | ||
654 | list_for_each_entry(res, &dlm->tracking_list, tracking) | ||
655 | break; | ||
656 | dlm_lockres_get(res); | ||
657 | dl->dl_res = res; | ||
658 | } else | ||
659 | dl = NULL; | ||
660 | } | 649 | } |
650 | spin_unlock(&dlm->track_lock); | ||
661 | 651 | ||
662 | if (dl) { | 652 | if (oldres) |
663 | spin_lock(&dl->dl_res->spinlock); | 653 | dlm_lockres_put(oldres); |
664 | dump_lockres(dl->dl_res, dl->dl_buf, dl->dl_len - 1); | ||
665 | spin_unlock(&dl->dl_res->spinlock); | ||
666 | } | ||
667 | 654 | ||
668 | spin_unlock(&dlm->spinlock); | 655 | dl->dl_res = res; |
656 | |||
657 | if (res) { | ||
658 | spin_lock(&res->spinlock); | ||
659 | dump_lockres(res, dl->dl_buf, dl->dl_len - 1); | ||
660 | spin_unlock(&res->spinlock); | ||
661 | } else | ||
662 | dl = NULL; | ||
669 | 663 | ||
664 | /* passed to seq_show */ | ||
670 | return dl; | 665 | return dl; |
671 | } | 666 | } |
672 | 667 | ||
diff --git a/fs/ocfs2/dlm/dlmdomain.c b/fs/ocfs2/dlm/dlmdomain.c index 63f8125824e8..d8d578f45613 100644 --- a/fs/ocfs2/dlm/dlmdomain.c +++ b/fs/ocfs2/dlm/dlmdomain.c | |||
@@ -1550,6 +1550,7 @@ static struct dlm_ctxt *dlm_alloc_ctxt(const char *domain, | |||
1550 | spin_lock_init(&dlm->spinlock); | 1550 | spin_lock_init(&dlm->spinlock); |
1551 | spin_lock_init(&dlm->master_lock); | 1551 | spin_lock_init(&dlm->master_lock); |
1552 | spin_lock_init(&dlm->ast_lock); | 1552 | spin_lock_init(&dlm->ast_lock); |
1553 | spin_lock_init(&dlm->track_lock); | ||
1553 | INIT_LIST_HEAD(&dlm->list); | 1554 | INIT_LIST_HEAD(&dlm->list); |
1554 | INIT_LIST_HEAD(&dlm->dirty_list); | 1555 | INIT_LIST_HEAD(&dlm->dirty_list); |
1555 | INIT_LIST_HEAD(&dlm->reco.resources); | 1556 | INIT_LIST_HEAD(&dlm->reco.resources); |
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c index 92fd1d7d6126..cbf3abe24cdb 100644 --- a/fs/ocfs2/dlm/dlmmaster.c +++ b/fs/ocfs2/dlm/dlmmaster.c | |||
@@ -505,8 +505,10 @@ void dlm_change_lockres_owner(struct dlm_ctxt *dlm, | |||
505 | static void dlm_lockres_release(struct kref *kref) | 505 | static void dlm_lockres_release(struct kref *kref) |
506 | { | 506 | { |
507 | struct dlm_lock_resource *res; | 507 | struct dlm_lock_resource *res; |
508 | struct dlm_ctxt *dlm; | ||
508 | 509 | ||
509 | res = container_of(kref, struct dlm_lock_resource, refs); | 510 | res = container_of(kref, struct dlm_lock_resource, refs); |
511 | dlm = res->dlm; | ||
510 | 512 | ||
511 | /* This should not happen -- all lockres' have a name | 513 | /* This should not happen -- all lockres' have a name |
512 | * associated with them at init time. */ | 514 | * associated with them at init time. */ |
@@ -515,6 +517,7 @@ static void dlm_lockres_release(struct kref *kref) | |||
515 | mlog(0, "destroying lockres %.*s\n", res->lockname.len, | 517 | mlog(0, "destroying lockres %.*s\n", res->lockname.len, |
516 | res->lockname.name); | 518 | res->lockname.name); |
517 | 519 | ||
520 | spin_lock(&dlm->track_lock); | ||
518 | if (!list_empty(&res->tracking)) | 521 | if (!list_empty(&res->tracking)) |
519 | list_del_init(&res->tracking); | 522 | list_del_init(&res->tracking); |
520 | else { | 523 | else { |
@@ -522,6 +525,9 @@ static void dlm_lockres_release(struct kref *kref) | |||
522 | res->lockname.len, res->lockname.name); | 525 | res->lockname.len, res->lockname.name); |
523 | dlm_print_one_lock_resource(res); | 526 | dlm_print_one_lock_resource(res); |
524 | } | 527 | } |
528 | spin_unlock(&dlm->track_lock); | ||
529 | |||
530 | dlm_put(dlm); | ||
525 | 531 | ||
526 | if (!hlist_unhashed(&res->hash_node) || | 532 | if (!hlist_unhashed(&res->hash_node) || |
527 | !list_empty(&res->granted) || | 533 | !list_empty(&res->granted) || |
@@ -595,6 +601,10 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm, | |||
595 | res->migration_pending = 0; | 601 | res->migration_pending = 0; |
596 | res->inflight_locks = 0; | 602 | res->inflight_locks = 0; |
597 | 603 | ||
604 | /* put in dlm_lockres_release */ | ||
605 | dlm_grab(dlm); | ||
606 | res->dlm = dlm; | ||
607 | |||
598 | kref_init(&res->refs); | 608 | kref_init(&res->refs); |
599 | 609 | ||
600 | /* just for consistency */ | 610 | /* just for consistency */ |