aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2
diff options
context:
space:
mode:
authorSunil Mushran <sunil.mushran@oracle.com>2010-10-06 20:55:12 -0400
committerSunil Mushran <sunil.mushran@oracle.com>2010-10-06 20:55:12 -0400
commit1f28530537f106f83e5cf7ef0193075667b6d520 (patch)
tree1e05f43048c868dc5c2444591bcf1f156b97c435 /fs/ocfs2
parenta6de013654b4839c8609e26241ebd9eb1ecc52e6 (diff)
ocfs2/cluster: Create debugfs dir/files for each region
This patch creates debugfs directory for each o2hb region and creates files to expose the region number and the per region live node bitmap. This information will be useful in debugging cluster issues. Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
Diffstat (limited to 'fs/ocfs2')
-rw-r--r--fs/ocfs2/cluster/heartbeat.c77
1 files changed, 77 insertions, 0 deletions
diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c
index b06b9e52fba8..f28de4b09c6b 100644
--- a/fs/ocfs2/cluster/heartbeat.c
+++ b/fs/ocfs2/cluster/heartbeat.c
@@ -79,6 +79,8 @@ static unsigned long o2hb_failed_region_bitmap[BITS_TO_LONGS(O2NM_MAX_REGIONS)];
79#define O2HB_DB_TYPE_LIVEREGIONS 1 79#define O2HB_DB_TYPE_LIVEREGIONS 1
80#define O2HB_DB_TYPE_QUORUMREGIONS 2 80#define O2HB_DB_TYPE_QUORUMREGIONS 2
81#define O2HB_DB_TYPE_FAILEDREGIONS 3 81#define O2HB_DB_TYPE_FAILEDREGIONS 3
82#define O2HB_DB_TYPE_REGION_LIVENODES 4
83#define O2HB_DB_TYPE_REGION_NUMBER 5
82struct o2hb_debug_buf { 84struct o2hb_debug_buf {
83 int db_type; 85 int db_type;
84 int db_size; 86 int db_size;
@@ -96,6 +98,7 @@ static struct o2hb_debug_buf *o2hb_db_failedregions;
96#define O2HB_DEBUG_LIVEREGIONS "live_regions" 98#define O2HB_DEBUG_LIVEREGIONS "live_regions"
97#define O2HB_DEBUG_QUORUMREGIONS "quorum_regions" 99#define O2HB_DEBUG_QUORUMREGIONS "quorum_regions"
98#define O2HB_DEBUG_FAILEDREGIONS "failed_regions" 100#define O2HB_DEBUG_FAILEDREGIONS "failed_regions"
101#define O2HB_DEBUG_REGION_NUMBER "num"
99 102
100static struct dentry *o2hb_debug_dir; 103static struct dentry *o2hb_debug_dir;
101static struct dentry *o2hb_debug_livenodes; 104static struct dentry *o2hb_debug_livenodes;
@@ -203,6 +206,12 @@ struct o2hb_region {
203 unsigned long hr_live_node_bitmap[BITS_TO_LONGS(O2NM_MAX_NODES)]; 206 unsigned long hr_live_node_bitmap[BITS_TO_LONGS(O2NM_MAX_NODES)];
204 unsigned int hr_region_num; 207 unsigned int hr_region_num;
205 208
209 struct dentry *hr_debug_dir;
210 struct dentry *hr_debug_livenodes;
211 struct dentry *hr_debug_regnum;
212 struct o2hb_debug_buf *hr_db_livenodes;
213 struct o2hb_debug_buf *hr_db_regnum;
214
206 /* let the person setting up hb wait for it to return until it 215 /* let the person setting up hb wait for it to return until it
207 * has reached a 'steady' state. This will be fixed when we have 216 * has reached a 'steady' state. This will be fixed when we have
208 * a more complete api that doesn't lead to this sort of fragility. */ 217 * a more complete api that doesn't lead to this sort of fragility. */
@@ -1083,6 +1092,7 @@ static int o2hb_thread(void *data)
1083static int o2hb_debug_open(struct inode *inode, struct file *file) 1092static int o2hb_debug_open(struct inode *inode, struct file *file)
1084{ 1093{
1085 struct o2hb_debug_buf *db = inode->i_private; 1094 struct o2hb_debug_buf *db = inode->i_private;
1095 struct o2hb_region *reg;
1086 unsigned long map[BITS_TO_LONGS(O2NM_MAX_NODES)]; 1096 unsigned long map[BITS_TO_LONGS(O2NM_MAX_NODES)];
1087 char *buf = NULL; 1097 char *buf = NULL;
1088 int i = -1; 1098 int i = -1;
@@ -1105,6 +1115,19 @@ static int o2hb_debug_open(struct inode *inode, struct file *file)
1105 spin_unlock(&o2hb_live_lock); 1115 spin_unlock(&o2hb_live_lock);
1106 break; 1116 break;
1107 1117
1118 case O2HB_DB_TYPE_REGION_LIVENODES:
1119 spin_lock(&o2hb_live_lock);
1120 reg = (struct o2hb_region *)db->db_data;
1121 memcpy(map, reg->hr_live_node_bitmap, db->db_size);
1122 spin_unlock(&o2hb_live_lock);
1123 break;
1124
1125 case O2HB_DB_TYPE_REGION_NUMBER:
1126 reg = (struct o2hb_region *)db->db_data;
1127 out += snprintf(buf + out, PAGE_SIZE - out, "%d\n",
1128 reg->hr_region_num);
1129 goto done;
1130
1108 default: 1131 default:
1109 goto done; 1132 goto done;
1110 } 1133 }
@@ -1342,6 +1365,12 @@ static void o2hb_region_release(struct config_item *item)
1342 if (reg->hr_slots) 1365 if (reg->hr_slots)
1343 kfree(reg->hr_slots); 1366 kfree(reg->hr_slots);
1344 1367
1368 kfree(reg->hr_db_regnum);
1369 kfree(reg->hr_db_livenodes);
1370 debugfs_remove(reg->hr_debug_livenodes);
1371 debugfs_remove(reg->hr_debug_regnum);
1372 debugfs_remove(reg->hr_debug_dir);
1373
1345 spin_lock(&o2hb_live_lock); 1374 spin_lock(&o2hb_live_lock);
1346 list_del(&reg->hr_all_item); 1375 list_del(&reg->hr_all_item);
1347 spin_unlock(&o2hb_live_lock); 1376 spin_unlock(&o2hb_live_lock);
@@ -1856,10 +1885,52 @@ static struct o2hb_heartbeat_group *to_o2hb_heartbeat_group(struct config_group
1856 : NULL; 1885 : NULL;
1857} 1886}
1858 1887
1888static int o2hb_debug_region_init(struct o2hb_region *reg, struct dentry *dir)
1889{
1890 int ret = -ENOMEM;
1891
1892 reg->hr_debug_dir =
1893 debugfs_create_dir(config_item_name(&reg->hr_item), dir);
1894 if (!reg->hr_debug_dir) {
1895 mlog_errno(ret);
1896 goto bail;
1897 }
1898
1899 reg->hr_debug_livenodes =
1900 o2hb_debug_create(O2HB_DEBUG_LIVENODES,
1901 reg->hr_debug_dir,
1902 &(reg->hr_db_livenodes),
1903 sizeof(*(reg->hr_db_livenodes)),
1904 O2HB_DB_TYPE_REGION_LIVENODES,
1905 sizeof(reg->hr_live_node_bitmap),
1906 O2NM_MAX_NODES, reg);
1907 if (!reg->hr_debug_livenodes) {
1908 mlog_errno(ret);
1909 goto bail;
1910 }
1911
1912 reg->hr_debug_regnum =
1913 o2hb_debug_create(O2HB_DEBUG_REGION_NUMBER,
1914 reg->hr_debug_dir,
1915 &(reg->hr_db_regnum),
1916 sizeof(*(reg->hr_db_regnum)),
1917 O2HB_DB_TYPE_REGION_NUMBER,
1918 0, O2NM_MAX_NODES, reg);
1919 if (!reg->hr_debug_regnum) {
1920 mlog_errno(ret);
1921 goto bail;
1922 }
1923
1924 ret = 0;
1925bail:
1926 return ret;
1927}
1928
1859static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *group, 1929static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *group,
1860 const char *name) 1930 const char *name)
1861{ 1931{
1862 struct o2hb_region *reg = NULL; 1932 struct o2hb_region *reg = NULL;
1933 int ret;
1863 1934
1864 reg = kzalloc(sizeof(struct o2hb_region), GFP_KERNEL); 1935 reg = kzalloc(sizeof(struct o2hb_region), GFP_KERNEL);
1865 if (reg == NULL) 1936 if (reg == NULL)
@@ -1884,6 +1955,12 @@ static struct config_item *o2hb_heartbeat_group_make_item(struct config_group *g
1884 1955
1885 config_item_init_type_name(&reg->hr_item, name, &o2hb_region_type); 1956 config_item_init_type_name(&reg->hr_item, name, &o2hb_region_type);
1886 1957
1958 ret = o2hb_debug_region_init(reg, o2hb_debug_dir);
1959 if (ret) {
1960 config_item_put(&reg->hr_item);
1961 return ERR_PTR(ret);
1962 }
1963
1887 return &reg->hr_item; 1964 return &reg->hr_item;
1888} 1965}
1889 1966