Commit 9adec1a8 authored by Roland Dreier's avatar Roland Dreier Committed by Linus Torvalds

[PATCH] IPoIB: convert to debugfs

Convert IPoIB to use debugfs instead of its own custom debugging filesystem.
Signed-off-by: default avatarRoland Dreier <roland@topspin.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent e6ded99c
...@@ -32,19 +32,16 @@ ...@@ -32,19 +32,16 @@
* $Id: ipoib_fs.c 1389 2004-12-27 22:56:47Z roland $ * $Id: ipoib_fs.c 1389 2004-12-27 22:56:47Z roland $
*/ */
#include <linux/pagemap.h> #include <linux/err.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include "ipoib.h" struct file_operations;
enum { #include <linux/debugfs.h>
IPOIB_MAGIC = 0x49504942 /* "IPIB" */
}; #include "ipoib.h"
static DECLARE_MUTEX(ipoib_fs_mutex);
static struct dentry *ipoib_root; static struct dentry *ipoib_root;
static struct super_block *ipoib_sb;
static LIST_HEAD(ipoib_device_list);
static void *ipoib_mcg_seq_start(struct seq_file *file, loff_t *pos) static void *ipoib_mcg_seq_start(struct seq_file *file, loff_t *pos)
{ {
...@@ -145,143 +142,34 @@ static struct file_operations ipoib_fops = { ...@@ -145,143 +142,34 @@ static struct file_operations ipoib_fops = {
.release = seq_release .release = seq_release
}; };
static struct inode *ipoib_get_inode(void) int ipoib_create_debug_file(struct net_device *dev)
{
struct inode *inode = new_inode(ipoib_sb);
if (inode) {
inode->i_mode = S_IFREG | S_IRUGO;
inode->i_uid = 0;
inode->i_gid = 0;
inode->i_blksize = PAGE_CACHE_SIZE;
inode->i_blocks = 0;
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
inode->i_fop = &ipoib_fops;
}
return inode;
}
static int __ipoib_create_debug_file(struct net_device *dev)
{ {
struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_dev_priv *priv = netdev_priv(dev);
struct dentry *dentry;
struct inode *inode;
char name[IFNAMSIZ + sizeof "_mcg"]; char name[IFNAMSIZ + sizeof "_mcg"];
snprintf(name, sizeof name, "%s_mcg", dev->name); snprintf(name, sizeof name, "%s_mcg", dev->name);
dentry = d_alloc_name(ipoib_root, name); priv->mcg_dentry = debugfs_create_file(name, S_IFREG | S_IRUGO,
if (!dentry) ipoib_root, dev, &ipoib_fops);
return -ENOMEM;
inode = ipoib_get_inode();
if (!inode) {
dput(dentry);
return -ENOMEM;
}
inode->u.generic_ip = dev;
priv->mcg_dentry = dentry;
d_add(dentry, inode);
return 0;
}
int ipoib_create_debug_file(struct net_device *dev)
{
struct ipoib_dev_priv *priv = netdev_priv(dev);
down(&ipoib_fs_mutex);
list_add_tail(&priv->fs_list, &ipoib_device_list);
if (!ipoib_sb) {
up(&ipoib_fs_mutex);
return 0;
}
up(&ipoib_fs_mutex);
return __ipoib_create_debug_file(dev); return priv->mcg_dentry ? 0 : -ENOMEM;
} }
void ipoib_delete_debug_file(struct net_device *dev) void ipoib_delete_debug_file(struct net_device *dev)
{ {
struct ipoib_dev_priv *priv = netdev_priv(dev); struct ipoib_dev_priv *priv = netdev_priv(dev);
down(&ipoib_fs_mutex); if (priv->mcg_dentry)
list_del(&priv->fs_list); debugfs_remove(priv->mcg_dentry);
if (!ipoib_sb) {
up(&ipoib_fs_mutex);
return;
}
up(&ipoib_fs_mutex);
if (priv->mcg_dentry) {
d_drop(priv->mcg_dentry);
simple_unlink(ipoib_root->d_inode, priv->mcg_dentry);
}
}
static int ipoib_fill_super(struct super_block *sb, void *data, int silent)
{
static struct tree_descr ipoib_files[] = {
{ "" }
};
struct ipoib_dev_priv *priv;
int ret;
ret = simple_fill_super(sb, IPOIB_MAGIC, ipoib_files);
if (ret)
return ret;
ipoib_root = sb->s_root;
down(&ipoib_fs_mutex);
ipoib_sb = sb;
list_for_each_entry(priv, &ipoib_device_list, fs_list) {
ret = __ipoib_create_debug_file(priv->dev);
if (ret)
break;
}
up(&ipoib_fs_mutex);
return ret;
}
static struct super_block *ipoib_get_sb(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data)
{
return get_sb_single(fs_type, flags, data, ipoib_fill_super);
} }
static void ipoib_kill_sb(struct super_block *sb)
{
down(&ipoib_fs_mutex);
ipoib_sb = NULL;
up(&ipoib_fs_mutex);
kill_litter_super(sb);
}
static struct file_system_type ipoib_fs_type = {
.owner = THIS_MODULE,
.name = "ipoib_debugfs",
.get_sb = ipoib_get_sb,
.kill_sb = ipoib_kill_sb,
};
int ipoib_register_debugfs(void) int ipoib_register_debugfs(void)
{ {
return register_filesystem(&ipoib_fs_type); ipoib_root = debugfs_create_dir("ipoib", NULL);
return ipoib_root ? 0 : -ENOMEM;
} }
void ipoib_unregister_debugfs(void) void ipoib_unregister_debugfs(void)
{ {
unregister_filesystem(&ipoib_fs_type); debugfs_remove(ipoib_root);
} }
...@@ -1082,19 +1082,19 @@ static int __init ipoib_init_module(void) ...@@ -1082,19 +1082,19 @@ static int __init ipoib_init_module(void)
return 0; return 0;
err_fs:
ipoib_unregister_debugfs();
err_wq: err_wq:
destroy_workqueue(ipoib_workqueue); destroy_workqueue(ipoib_workqueue);
err_fs:
ipoib_unregister_debugfs();
return ret; return ret;
} }
static void __exit ipoib_cleanup_module(void) static void __exit ipoib_cleanup_module(void)
{ {
ipoib_unregister_debugfs();
ib_unregister_client(&ipoib_client); ib_unregister_client(&ipoib_client);
ipoib_unregister_debugfs();
destroy_workqueue(ipoib_workqueue); destroy_workqueue(ipoib_workqueue);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment