diff options
Diffstat (limited to 'fs/ocfs2/cluster/heartbeat.c')
-rw-r--r-- | fs/ocfs2/cluster/heartbeat.c | 96 |
1 files changed, 95 insertions, 1 deletions
diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 04697ba7f73e..4f85eceab376 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include <linux/random.h> | 33 | #include <linux/random.h> |
34 | #include <linux/crc32.h> | 34 | #include <linux/crc32.h> |
35 | #include <linux/time.h> | 35 | #include <linux/time.h> |
36 | #include <linux/debugfs.h> | ||
36 | 37 | ||
37 | #include "heartbeat.h" | 38 | #include "heartbeat.h" |
38 | #include "tcp.h" | 39 | #include "tcp.h" |
@@ -60,6 +61,11 @@ static unsigned long o2hb_live_node_bitmap[BITS_TO_LONGS(O2NM_MAX_NODES)]; | |||
60 | static LIST_HEAD(o2hb_node_events); | 61 | static LIST_HEAD(o2hb_node_events); |
61 | static DECLARE_WAIT_QUEUE_HEAD(o2hb_steady_queue); | 62 | static DECLARE_WAIT_QUEUE_HEAD(o2hb_steady_queue); |
62 | 63 | ||
64 | #define O2HB_DEBUG_DIR "o2hb" | ||
65 | #define O2HB_DEBUG_LIVENODES "livenodes" | ||
66 | static struct dentry *o2hb_debug_dir; | ||
67 | static struct dentry *o2hb_debug_livenodes; | ||
68 | |||
63 | static LIST_HEAD(o2hb_all_regions); | 69 | static LIST_HEAD(o2hb_all_regions); |
64 | 70 | ||
65 | static struct o2hb_callback { | 71 | static struct o2hb_callback { |
@@ -905,7 +911,77 @@ static int o2hb_thread(void *data) | |||
905 | return 0; | 911 | return 0; |
906 | } | 912 | } |
907 | 913 | ||
908 | void o2hb_init(void) | 914 | #ifdef CONFIG_DEBUG_FS |
915 | static int o2hb_debug_open(struct inode *inode, struct file *file) | ||
916 | { | ||
917 | unsigned long map[BITS_TO_LONGS(O2NM_MAX_NODES)]; | ||
918 | char *buf = NULL; | ||
919 | int i = -1; | ||
920 | int out = 0; | ||
921 | |||
922 | buf = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
923 | if (!buf) | ||
924 | goto bail; | ||
925 | |||
926 | o2hb_fill_node_map(map, sizeof(map)); | ||
927 | |||
928 | while ((i = find_next_bit(map, O2NM_MAX_NODES, i + 1)) < O2NM_MAX_NODES) | ||
929 | out += snprintf(buf + out, PAGE_SIZE - out, "%d ", i); | ||
930 | out += snprintf(buf + out, PAGE_SIZE - out, "\n"); | ||
931 | |||
932 | i_size_write(inode, out); | ||
933 | |||
934 | file->private_data = buf; | ||
935 | |||
936 | return 0; | ||
937 | bail: | ||
938 | return -ENOMEM; | ||
939 | } | ||
940 | |||
941 | static int o2hb_debug_release(struct inode *inode, struct file *file) | ||
942 | { | ||
943 | kfree(file->private_data); | ||
944 | return 0; | ||
945 | } | ||
946 | |||
947 | static ssize_t o2hb_debug_read(struct file *file, char __user *buf, | ||
948 | size_t nbytes, loff_t *ppos) | ||
949 | { | ||
950 | return simple_read_from_buffer(buf, nbytes, ppos, file->private_data, | ||
951 | i_size_read(file->f_mapping->host)); | ||
952 | } | ||
953 | #else | ||
954 | static int o2hb_debug_open(struct inode *inode, struct file *file) | ||
955 | { | ||
956 | return 0; | ||
957 | } | ||
958 | static int o2hb_debug_release(struct inode *inode, struct file *file) | ||
959 | { | ||
960 | return 0; | ||
961 | } | ||
962 | static ssize_t o2hb_debug_read(struct file *file, char __user *buf, | ||
963 | size_t nbytes, loff_t *ppos) | ||
964 | { | ||
965 | return 0; | ||
966 | } | ||
967 | #endif /* CONFIG_DEBUG_FS */ | ||
968 | |||
969 | static struct file_operations o2hb_debug_fops = { | ||
970 | .open = o2hb_debug_open, | ||
971 | .release = o2hb_debug_release, | ||
972 | .read = o2hb_debug_read, | ||
973 | .llseek = generic_file_llseek, | ||
974 | }; | ||
975 | |||
976 | void o2hb_exit(void) | ||
977 | { | ||
978 | if (o2hb_debug_livenodes) | ||
979 | debugfs_remove(o2hb_debug_livenodes); | ||
980 | if (o2hb_debug_dir) | ||
981 | debugfs_remove(o2hb_debug_dir); | ||
982 | } | ||
983 | |||
984 | int o2hb_init(void) | ||
909 | { | 985 | { |
910 | int i; | 986 | int i; |
911 | 987 | ||
@@ -918,6 +994,24 @@ void o2hb_init(void) | |||
918 | INIT_LIST_HEAD(&o2hb_node_events); | 994 | INIT_LIST_HEAD(&o2hb_node_events); |
919 | 995 | ||
920 | memset(o2hb_live_node_bitmap, 0, sizeof(o2hb_live_node_bitmap)); | 996 | memset(o2hb_live_node_bitmap, 0, sizeof(o2hb_live_node_bitmap)); |
997 | |||
998 | o2hb_debug_dir = debugfs_create_dir(O2HB_DEBUG_DIR, NULL); | ||
999 | if (!o2hb_debug_dir) { | ||
1000 | mlog_errno(-ENOMEM); | ||
1001 | return -ENOMEM; | ||
1002 | } | ||
1003 | |||
1004 | o2hb_debug_livenodes = debugfs_create_file(O2HB_DEBUG_LIVENODES, | ||
1005 | S_IFREG|S_IRUSR, | ||
1006 | o2hb_debug_dir, NULL, | ||
1007 | &o2hb_debug_fops); | ||
1008 | if (!o2hb_debug_livenodes) { | ||
1009 | mlog_errno(-ENOMEM); | ||
1010 | debugfs_remove(o2hb_debug_dir); | ||
1011 | return -ENOMEM; | ||
1012 | } | ||
1013 | |||
1014 | return 0; | ||
921 | } | 1015 | } |
922 | 1016 | ||
923 | /* if we're already in a callback then we're already serialized by the sem */ | 1017 | /* if we're already in a callback then we're already serialized by the sem */ |