diff options
| author | Olof Johansson <olof@lixom.net> | 2011-12-15 22:02:34 -0800 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2011-12-15 22:02:34 -0800 | 
| commit | 02735a29d8ce882ec698803f064e17888874780c (patch) | |
| tree | 6a4afa3bc8b6d4334df24910a56f77adf126b0c7 /fs/ocfs2/cluster/netdebug.c | |
| parent | 8d685b7f4d9c9882442bf1b492558d5f17b694fa (diff) | |
| parent | 3d911ad22e8405c1a333a6812e405cb1a5ae9829 (diff) | |
| download | olio-linux-3.10-02735a29d8ce882ec698803f064e17888874780c.tar.xz olio-linux-3.10-02735a29d8ce882ec698803f064e17888874780c.zip  | |
Merge branch 'at91/defconfig' into next/cleanup
Diffstat (limited to 'fs/ocfs2/cluster/netdebug.c')
| -rw-r--r-- | fs/ocfs2/cluster/netdebug.c | 102 | 
1 files changed, 69 insertions, 33 deletions
diff --git a/fs/ocfs2/cluster/netdebug.c b/fs/ocfs2/cluster/netdebug.c index 3a5835904b3..dc45deb19e6 100644 --- a/fs/ocfs2/cluster/netdebug.c +++ b/fs/ocfs2/cluster/netdebug.c @@ -47,6 +47,7 @@  #define SC_DEBUG_NAME		"sock_containers"  #define NST_DEBUG_NAME		"send_tracking"  #define STATS_DEBUG_NAME	"stats" +#define NODES_DEBUG_NAME	"connected_nodes"  #define SHOW_SOCK_CONTAINERS	0  #define SHOW_SOCK_STATS		1 @@ -55,6 +56,7 @@ static struct dentry *o2net_dentry;  static struct dentry *sc_dentry;  static struct dentry *nst_dentry;  static struct dentry *stats_dentry; +static struct dentry *nodes_dentry;  static DEFINE_SPINLOCK(o2net_debug_lock); @@ -491,53 +493,87 @@ static const struct file_operations sc_seq_fops = {  	.release = sc_fop_release,  }; -int o2net_debugfs_init(void) +static int o2net_fill_bitmap(char *buf, int len)  { -	o2net_dentry = debugfs_create_dir(O2NET_DEBUG_DIR, NULL); -	if (!o2net_dentry) { -		mlog_errno(-ENOMEM); -		goto bail; -	} +	unsigned long map[BITS_TO_LONGS(O2NM_MAX_NODES)]; +	int i = -1, out = 0; -	nst_dentry = debugfs_create_file(NST_DEBUG_NAME, S_IFREG|S_IRUSR, -					 o2net_dentry, NULL, -					 &nst_seq_fops); -	if (!nst_dentry) { -		mlog_errno(-ENOMEM); -		goto bail; -	} +	o2net_fill_node_map(map, sizeof(map)); -	sc_dentry = debugfs_create_file(SC_DEBUG_NAME, S_IFREG|S_IRUSR, -					o2net_dentry, NULL, -					&sc_seq_fops); -	if (!sc_dentry) { -		mlog_errno(-ENOMEM); -		goto bail; -	} +	while ((i = find_next_bit(map, O2NM_MAX_NODES, i + 1)) < O2NM_MAX_NODES) +		out += snprintf(buf + out, PAGE_SIZE - out, "%d ", i); +	out += snprintf(buf + out, PAGE_SIZE - out, "\n"); -	stats_dentry = debugfs_create_file(STATS_DEBUG_NAME, S_IFREG|S_IRUSR, -					   o2net_dentry, NULL, -					   &stats_seq_fops); -	if (!stats_dentry) { -		mlog_errno(-ENOMEM); -		goto bail; -	} +	return out; +} + +static int nodes_fop_open(struct inode *inode, struct file *file) +{ +	char *buf; + +	buf = kmalloc(PAGE_SIZE, GFP_KERNEL); +	if (!buf) +		return -ENOMEM; + +	i_size_write(inode, o2net_fill_bitmap(buf, PAGE_SIZE)); + +	file->private_data = buf;  	return 0; -bail: -	debugfs_remove(stats_dentry); -	debugfs_remove(sc_dentry); -	debugfs_remove(nst_dentry); -	debugfs_remove(o2net_dentry); -	return -ENOMEM;  } +static int o2net_debug_release(struct inode *inode, struct file *file) +{ +	kfree(file->private_data); +	return 0; +} + +static ssize_t o2net_debug_read(struct file *file, char __user *buf, +				size_t nbytes, loff_t *ppos) +{ +	return simple_read_from_buffer(buf, nbytes, ppos, file->private_data, +				       i_size_read(file->f_mapping->host)); +} + +static const struct file_operations nodes_fops = { +	.open		= nodes_fop_open, +	.release	= o2net_debug_release, +	.read		= o2net_debug_read, +	.llseek		= generic_file_llseek, +}; +  void o2net_debugfs_exit(void)  { +	debugfs_remove(nodes_dentry);  	debugfs_remove(stats_dentry);  	debugfs_remove(sc_dentry);  	debugfs_remove(nst_dentry);  	debugfs_remove(o2net_dentry);  } +int o2net_debugfs_init(void) +{ +	mode_t mode = S_IFREG|S_IRUSR; + +	o2net_dentry = debugfs_create_dir(O2NET_DEBUG_DIR, NULL); +	if (o2net_dentry) +		nst_dentry = debugfs_create_file(NST_DEBUG_NAME, mode, +					o2net_dentry, NULL, &nst_seq_fops); +	if (nst_dentry) +		sc_dentry = debugfs_create_file(SC_DEBUG_NAME, mode, +					o2net_dentry, NULL, &sc_seq_fops); +	if (sc_dentry) +		stats_dentry = debugfs_create_file(STATS_DEBUG_NAME, mode, +					o2net_dentry, NULL, &stats_seq_fops); +	if (stats_dentry) +		nodes_dentry = debugfs_create_file(NODES_DEBUG_NAME, mode, +					o2net_dentry, NULL, &nodes_fops); +	if (nodes_dentry) +		return 0; + +	o2net_debugfs_exit(); +	mlog_errno(-ENOMEM); +	return -ENOMEM; +} +  #endif	/* CONFIG_DEBUG_FS */  |