diff options
author | Sunil Mushran <sunil.mushran@oracle.com> | 2008-03-10 18:16:27 -0400 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2008-04-18 11:56:09 -0400 |
commit | 7209300a9b987e017cae2ef9d7ef55b0fdd71869 (patch) | |
tree | 928002c58079dc53846248c7c91c293432dfdf8c /fs/ocfs2 | |
parent | d0129aceaecc2b1f5171b8e8036eb469b6e0fe81 (diff) |
ocfs2/dlm: Dumps the purgelist into a debugfs file
This patch dumps all the lockres' on the purgelist it can fit in one page
into a debugfs file. Useful for debugging.
Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r-- | fs/ocfs2/dlm/dlmdebug.c | 71 | ||||
-rw-r--r-- | fs/ocfs2/dlm/dlmdebug.h | 1 |
2 files changed, 72 insertions, 0 deletions
diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c index 6de326bf603a..a109005f70da 100644 --- a/fs/ocfs2/dlm/dlmdebug.c +++ b/fs/ocfs2/dlm/dlmdebug.c | |||
@@ -303,6 +303,7 @@ static int stringify_lockname(const char *lockname, int locklen, | |||
303 | #define DLM_DEBUGFS_DLM_STATE "dlm_state" | 303 | #define DLM_DEBUGFS_DLM_STATE "dlm_state" |
304 | #define DLM_DEBUGFS_LOCKING_STATE "locking_state" | 304 | #define DLM_DEBUGFS_LOCKING_STATE "locking_state" |
305 | #define DLM_DEBUGFS_MLE_STATE "mle_state" | 305 | #define DLM_DEBUGFS_MLE_STATE "mle_state" |
306 | #define DLM_DEBUGFS_PURGE_LIST "purge_list" | ||
306 | 307 | ||
307 | /* begin - utils funcs */ | 308 | /* begin - utils funcs */ |
308 | static void dlm_debug_free(struct kref *kref) | 309 | static void dlm_debug_free(struct kref *kref) |
@@ -396,6 +397,63 @@ static int debug_buffer_release(struct inode *inode, struct file *file) | |||
396 | } | 397 | } |
397 | /* end - util funcs */ | 398 | /* end - util funcs */ |
398 | 399 | ||
400 | /* begin - purge list funcs */ | ||
401 | static int debug_purgelist_print(struct dlm_ctxt *dlm, struct debug_buffer *db) | ||
402 | { | ||
403 | struct dlm_lock_resource *res; | ||
404 | int out = 0; | ||
405 | unsigned long total = 0; | ||
406 | |||
407 | out += snprintf(db->buf + out, db->len - out, | ||
408 | "Dumping Purgelist for Domain: %s\n", dlm->name); | ||
409 | |||
410 | spin_lock(&dlm->spinlock); | ||
411 | list_for_each_entry(res, &dlm->purge_list, purge) { | ||
412 | ++total; | ||
413 | if (db->len - out < 100) | ||
414 | continue; | ||
415 | spin_lock(&res->spinlock); | ||
416 | out += stringify_lockname(res->lockname.name, | ||
417 | res->lockname.len, | ||
418 | db->buf + out, db->len - out); | ||
419 | out += snprintf(db->buf + out, db->len - out, "\t%ld\n", | ||
420 | (jiffies - res->last_used)/HZ); | ||
421 | spin_unlock(&res->spinlock); | ||
422 | } | ||
423 | spin_unlock(&dlm->spinlock); | ||
424 | |||
425 | out += snprintf(db->buf + out, db->len - out, | ||
426 | "Total on list: %ld\n", total); | ||
427 | |||
428 | return out; | ||
429 | } | ||
430 | |||
431 | static int debug_purgelist_open(struct inode *inode, struct file *file) | ||
432 | { | ||
433 | struct dlm_ctxt *dlm = inode->i_private; | ||
434 | struct debug_buffer *db; | ||
435 | |||
436 | db = debug_buffer_allocate(); | ||
437 | if (!db) | ||
438 | goto bail; | ||
439 | |||
440 | db->len = debug_purgelist_print(dlm, db); | ||
441 | |||
442 | file->private_data = db; | ||
443 | |||
444 | return 0; | ||
445 | bail: | ||
446 | return -ENOMEM; | ||
447 | } | ||
448 | |||
449 | static struct file_operations debug_purgelist_fops = { | ||
450 | .open = debug_purgelist_open, | ||
451 | .release = debug_buffer_release, | ||
452 | .read = debug_buffer_read, | ||
453 | .llseek = debug_buffer_llseek, | ||
454 | }; | ||
455 | /* end - purge list funcs */ | ||
456 | |||
399 | /* begin - debug mle funcs */ | 457 | /* begin - debug mle funcs */ |
400 | static int dump_mle(struct dlm_master_list_entry *mle, char *buf, int len) | 458 | static int dump_mle(struct dlm_master_list_entry *mle, char *buf, int len) |
401 | { | 459 | { |
@@ -906,6 +964,17 @@ int dlm_debug_init(struct dlm_ctxt *dlm) | |||
906 | goto bail; | 964 | goto bail; |
907 | } | 965 | } |
908 | 966 | ||
967 | /* for dumping lockres on the purge list */ | ||
968 | dc->debug_purgelist_dentry = | ||
969 | debugfs_create_file(DLM_DEBUGFS_PURGE_LIST, | ||
970 | S_IFREG|S_IRUSR, | ||
971 | dlm->dlm_debugfs_subroot, | ||
972 | dlm, &debug_purgelist_fops); | ||
973 | if (!dc->debug_purgelist_dentry) { | ||
974 | mlog_errno(-ENOMEM); | ||
975 | goto bail; | ||
976 | } | ||
977 | |||
909 | dlm_debug_get(dc); | 978 | dlm_debug_get(dc); |
910 | return 0; | 979 | return 0; |
911 | 980 | ||
@@ -919,6 +988,8 @@ void dlm_debug_shutdown(struct dlm_ctxt *dlm) | |||
919 | struct dlm_debug_ctxt *dc = dlm->dlm_debug_ctxt; | 988 | struct dlm_debug_ctxt *dc = dlm->dlm_debug_ctxt; |
920 | 989 | ||
921 | if (dc) { | 990 | if (dc) { |
991 | if (dc->debug_purgelist_dentry) | ||
992 | debugfs_remove(dc->debug_purgelist_dentry); | ||
922 | if (dc->debug_mle_dentry) | 993 | if (dc->debug_mle_dentry) |
923 | debugfs_remove(dc->debug_mle_dentry); | 994 | debugfs_remove(dc->debug_mle_dentry); |
924 | if (dc->debug_lockres_dentry) | 995 | if (dc->debug_lockres_dentry) |
diff --git a/fs/ocfs2/dlm/dlmdebug.h b/fs/ocfs2/dlm/dlmdebug.h index cbc69f295782..8857743e8f32 100644 --- a/fs/ocfs2/dlm/dlmdebug.h +++ b/fs/ocfs2/dlm/dlmdebug.h | |||
@@ -32,6 +32,7 @@ struct dlm_debug_ctxt { | |||
32 | struct dentry *debug_state_dentry; | 32 | struct dentry *debug_state_dentry; |
33 | struct dentry *debug_lockres_dentry; | 33 | struct dentry *debug_lockres_dentry; |
34 | struct dentry *debug_mle_dentry; | 34 | struct dentry *debug_mle_dentry; |
35 | struct dentry *debug_purgelist_dentry; | ||
35 | }; | 36 | }; |
36 | 37 | ||
37 | struct debug_buffer { | 38 | struct debug_buffer { |