diff options
Diffstat (limited to 'fs/ocfs2/dlm/dlmdebug.c')
-rw-r--r-- | fs/ocfs2/dlm/dlmdebug.c | 87 |
1 files changed, 55 insertions, 32 deletions
diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c index b32f60a5acfb..df52f706f669 100644 --- a/fs/ocfs2/dlm/dlmdebug.c +++ b/fs/ocfs2/dlm/dlmdebug.c | |||
@@ -287,18 +287,8 @@ static int stringify_nodemap(unsigned long *nodemap, int maxnodes, | |||
287 | static int dump_mle(struct dlm_master_list_entry *mle, char *buf, int len) | 287 | static int dump_mle(struct dlm_master_list_entry *mle, char *buf, int len) |
288 | { | 288 | { |
289 | int out = 0; | 289 | int out = 0; |
290 | unsigned int namelen; | ||
291 | const char *name; | ||
292 | char *mle_type; | 290 | char *mle_type; |
293 | 291 | ||
294 | if (mle->type != DLM_MLE_MASTER) { | ||
295 | namelen = mle->u.name.len; | ||
296 | name = mle->u.name.name; | ||
297 | } else { | ||
298 | namelen = mle->u.res->lockname.len; | ||
299 | name = mle->u.res->lockname.name; | ||
300 | } | ||
301 | |||
302 | if (mle->type == DLM_MLE_BLOCK) | 292 | if (mle->type == DLM_MLE_BLOCK) |
303 | mle_type = "BLK"; | 293 | mle_type = "BLK"; |
304 | else if (mle->type == DLM_MLE_MASTER) | 294 | else if (mle->type == DLM_MLE_MASTER) |
@@ -306,7 +296,7 @@ static int dump_mle(struct dlm_master_list_entry *mle, char *buf, int len) | |||
306 | else | 296 | else |
307 | mle_type = "MIG"; | 297 | mle_type = "MIG"; |
308 | 298 | ||
309 | out += stringify_lockname(name, namelen, buf + out, len - out); | 299 | out += stringify_lockname(mle->mname, mle->mnamelen, buf + out, len - out); |
310 | out += snprintf(buf + out, len - out, | 300 | out += snprintf(buf + out, len - out, |
311 | "\t%3s\tmas=%3u\tnew=%3u\tevt=%1d\tuse=%1d\tref=%3d\n", | 301 | "\t%3s\tmas=%3u\tnew=%3u\tevt=%1d\tuse=%1d\tref=%3d\n", |
312 | mle_type, mle->master, mle->new_master, | 302 | mle_type, mle->master, mle->new_master, |
@@ -501,23 +491,33 @@ static struct file_operations debug_purgelist_fops = { | |||
501 | static int debug_mle_print(struct dlm_ctxt *dlm, struct debug_buffer *db) | 491 | static int debug_mle_print(struct dlm_ctxt *dlm, struct debug_buffer *db) |
502 | { | 492 | { |
503 | struct dlm_master_list_entry *mle; | 493 | struct dlm_master_list_entry *mle; |
504 | int out = 0; | 494 | struct hlist_head *bucket; |
505 | unsigned long total = 0; | 495 | struct hlist_node *list; |
496 | int i, out = 0; | ||
497 | unsigned long total = 0, longest = 0, bktcnt; | ||
506 | 498 | ||
507 | out += snprintf(db->buf + out, db->len - out, | 499 | out += snprintf(db->buf + out, db->len - out, |
508 | "Dumping MLEs for Domain: %s\n", dlm->name); | 500 | "Dumping MLEs for Domain: %s\n", dlm->name); |
509 | 501 | ||
510 | spin_lock(&dlm->master_lock); | 502 | spin_lock(&dlm->master_lock); |
511 | list_for_each_entry(mle, &dlm->master_list, list) { | 503 | for (i = 0; i < DLM_HASH_BUCKETS; i++) { |
512 | ++total; | 504 | bucket = dlm_master_hash(dlm, i); |
513 | if (db->len - out < 200) | 505 | hlist_for_each(list, bucket) { |
514 | continue; | 506 | mle = hlist_entry(list, struct dlm_master_list_entry, |
515 | out += dump_mle(mle, db->buf + out, db->len - out); | 507 | master_hash_node); |
508 | ++total; | ||
509 | ++bktcnt; | ||
510 | if (db->len - out < 200) | ||
511 | continue; | ||
512 | out += dump_mle(mle, db->buf + out, db->len - out); | ||
513 | } | ||
514 | longest = max(longest, bktcnt); | ||
515 | bktcnt = 0; | ||
516 | } | 516 | } |
517 | spin_unlock(&dlm->master_lock); | 517 | spin_unlock(&dlm->master_lock); |
518 | 518 | ||
519 | out += snprintf(db->buf + out, db->len - out, | 519 | out += snprintf(db->buf + out, db->len - out, |
520 | "Total on list: %ld\n", total); | 520 | "Total: %ld, Longest: %ld\n", total, longest); |
521 | return out; | 521 | return out; |
522 | } | 522 | } |
523 | 523 | ||
@@ -756,12 +756,8 @@ static int debug_state_print(struct dlm_ctxt *dlm, struct debug_buffer *db) | |||
756 | int out = 0; | 756 | int out = 0; |
757 | struct dlm_reco_node_data *node; | 757 | struct dlm_reco_node_data *node; |
758 | char *state; | 758 | char *state; |
759 | int lres, rres, ures, tres; | 759 | int cur_mles = 0, tot_mles = 0; |
760 | 760 | int i; | |
761 | lres = atomic_read(&dlm->local_resources); | ||
762 | rres = atomic_read(&dlm->remote_resources); | ||
763 | ures = atomic_read(&dlm->unknown_resources); | ||
764 | tres = lres + rres + ures; | ||
765 | 761 | ||
766 | spin_lock(&dlm->spinlock); | 762 | spin_lock(&dlm->spinlock); |
767 | 763 | ||
@@ -804,21 +800,48 @@ static int debug_state_print(struct dlm_ctxt *dlm, struct debug_buffer *db) | |||
804 | db->buf + out, db->len - out); | 800 | db->buf + out, db->len - out); |
805 | out += snprintf(db->buf + out, db->len - out, "\n"); | 801 | out += snprintf(db->buf + out, db->len - out, "\n"); |
806 | 802 | ||
807 | /* Mastered Resources Total: xxx Locally: xxx Remotely: ... */ | 803 | /* Lock Resources: xxx (xxx) */ |
804 | out += snprintf(db->buf + out, db->len - out, | ||
805 | "Lock Resources: %d (%d)\n", | ||
806 | atomic_read(&dlm->res_cur_count), | ||
807 | atomic_read(&dlm->res_tot_count)); | ||
808 | |||
809 | for (i = 0; i < DLM_MLE_NUM_TYPES; ++i) | ||
810 | tot_mles += atomic_read(&dlm->mle_tot_count[i]); | ||
811 | |||
812 | for (i = 0; i < DLM_MLE_NUM_TYPES; ++i) | ||
813 | cur_mles += atomic_read(&dlm->mle_cur_count[i]); | ||
814 | |||
815 | /* MLEs: xxx (xxx) */ | ||
816 | out += snprintf(db->buf + out, db->len - out, | ||
817 | "MLEs: %d (%d)\n", cur_mles, tot_mles); | ||
818 | |||
819 | /* Blocking: xxx (xxx) */ | ||
820 | out += snprintf(db->buf + out, db->len - out, | ||
821 | " Blocking: %d (%d)\n", | ||
822 | atomic_read(&dlm->mle_cur_count[DLM_MLE_BLOCK]), | ||
823 | atomic_read(&dlm->mle_tot_count[DLM_MLE_BLOCK])); | ||
824 | |||
825 | /* Mastery: xxx (xxx) */ | ||
826 | out += snprintf(db->buf + out, db->len - out, | ||
827 | " Mastery: %d (%d)\n", | ||
828 | atomic_read(&dlm->mle_cur_count[DLM_MLE_MASTER]), | ||
829 | atomic_read(&dlm->mle_tot_count[DLM_MLE_MASTER])); | ||
830 | |||
831 | /* Migration: xxx (xxx) */ | ||
808 | out += snprintf(db->buf + out, db->len - out, | 832 | out += snprintf(db->buf + out, db->len - out, |
809 | "Mastered Resources Total: %d Locally: %d " | 833 | " Migration: %d (%d)\n", |
810 | "Remotely: %d Unknown: %d\n", | 834 | atomic_read(&dlm->mle_cur_count[DLM_MLE_MIGRATION]), |
811 | tres, lres, rres, ures); | 835 | atomic_read(&dlm->mle_tot_count[DLM_MLE_MIGRATION])); |
812 | 836 | ||
813 | /* Lists: Dirty=Empty Purge=InUse PendingASTs=Empty ... */ | 837 | /* Lists: Dirty=Empty Purge=InUse PendingASTs=Empty ... */ |
814 | out += snprintf(db->buf + out, db->len - out, | 838 | out += snprintf(db->buf + out, db->len - out, |
815 | "Lists: Dirty=%s Purge=%s PendingASTs=%s " | 839 | "Lists: Dirty=%s Purge=%s PendingASTs=%s " |
816 | "PendingBASTs=%s Master=%s\n", | 840 | "PendingBASTs=%s\n", |
817 | (list_empty(&dlm->dirty_list) ? "Empty" : "InUse"), | 841 | (list_empty(&dlm->dirty_list) ? "Empty" : "InUse"), |
818 | (list_empty(&dlm->purge_list) ? "Empty" : "InUse"), | 842 | (list_empty(&dlm->purge_list) ? "Empty" : "InUse"), |
819 | (list_empty(&dlm->pending_asts) ? "Empty" : "InUse"), | 843 | (list_empty(&dlm->pending_asts) ? "Empty" : "InUse"), |
820 | (list_empty(&dlm->pending_basts) ? "Empty" : "InUse"), | 844 | (list_empty(&dlm->pending_basts) ? "Empty" : "InUse")); |
821 | (list_empty(&dlm->master_list) ? "Empty" : "InUse")); | ||
822 | 845 | ||
823 | /* Purge Count: xxx Refs: xxx */ | 846 | /* Purge Count: xxx Refs: xxx */ |
824 | out += snprintf(db->buf + out, db->len - out, | 847 | out += snprintf(db->buf + out, db->len - out, |