summaryrefslogtreecommitdiff
path: root/drivers/staging/dgrp
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-05-01 17:51:54 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2013-05-01 17:51:54 -0700
commit20b4fb485227404329e41ad15588afad3df23050 (patch)
treef3e099f0ab3da8a93b447203e294d2bb22f6dc05 /drivers/staging/dgrp
parentb9394d8a657cd3c064fa432aa0905c1b58b38fe9 (diff)
parentac3e3c5b1164397656df81b9e9ab4991184d3236 (diff)
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull VFS updates from Al Viro, Misc cleanups all over the place, mainly wrt /proc interfaces (switch create_proc_entry to proc_create(), get rid of the deprecated create_proc_read_entry() in favor of using proc_create_data() and seq_file etc). 7kloc removed. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (204 commits) don't bother with deferred freeing of fdtables proc: Move non-public stuff from linux/proc_fs.h to fs/proc/internal.h proc: Make the PROC_I() and PDE() macros internal to procfs proc: Supply a function to remove a proc entry by PDE take cgroup_open() and cpuset_open() to fs/proc/base.c ppc: Clean up scanlog ppc: Clean up rtas_flash driver somewhat hostap: proc: Use remove_proc_subtree() drm: proc: Use remove_proc_subtree() drm: proc: Use minor->index to label things, not PDE->name drm: Constify drm_proc_list[] zoran: Don't print proc_dir_entry data in debug reiserfs: Don't access the proc_dir_entry in r_open(), r_start() r_show() proc: Supply an accessor for getting the data from a PDE's parent airo: Use remove_proc_subtree() rtl8192u: Don't need to save device proc dir PDE rtl8187se: Use a dir under /proc/net/r8180/ proc: Add proc_mkdir_data() proc: Move some bits from linux/proc_fs.h to linux/{of.h,signal.h,tty.h} proc: Move PDE_NET() to fs/proc/proc_net.c ...
Diffstat (limited to 'drivers/staging/dgrp')
-rw-r--r--drivers/staging/dgrp/dgrp_common.c31
-rw-r--r--drivers/staging/dgrp/dgrp_common.h65
-rw-r--r--drivers/staging/dgrp/dgrp_dpa_ops.c29
-rw-r--r--drivers/staging/dgrp/dgrp_mon_ops.c26
-rw-r--r--drivers/staging/dgrp/dgrp_net_ops.c30
-rw-r--r--drivers/staging/dgrp/dgrp_ports_ops.c18
-rw-r--r--drivers/staging/dgrp/dgrp_specproc.c399
7 files changed, 69 insertions, 529 deletions
diff --git a/drivers/staging/dgrp/dgrp_common.c b/drivers/staging/dgrp/dgrp_common.c
index 3553998b72bc..9a9b45624ba9 100644
--- a/drivers/staging/dgrp/dgrp_common.c
+++ b/drivers/staging/dgrp/dgrp_common.c
@@ -167,34 +167,3 @@ void dgrp_carrier(struct ch_struct *ch)
ch->ch_flag &= ~CH_PHYS_CD;
}
-
-/**
- * dgrp_chk_perm() -- check permissions for net device
- * @inode: pointer to inode structure for the net communication device
- * @op: operation to be tested
- *
- * The file permissions and ownerships are tested to determine whether
- * the operation "op" is permitted on the file pointed to by the inode.
- * Returns 0 if the operation is permitted, -EACCESS otherwise
- */
-int dgrp_chk_perm(int mode, int op)
-{
- if (!uid_eq(GLOBAL_ROOT_UID, current_euid()))
- mode >>= 6;
- else if (in_egroup_p(GLOBAL_ROOT_GID))
- mode >>= 3;
-
- if ((mode & op & 0007) == op)
- return 0;
-
- if (capable(CAP_SYS_ADMIN))
- return 0;
-
- return -EACCES;
-}
-
-/* dgrp_chk_perm wrapper for permission call in struct inode_operations */
-int dgrp_inode_permission(struct inode *inode, int op)
-{
- return dgrp_chk_perm(inode->i_mode, op);
-}
diff --git a/drivers/staging/dgrp/dgrp_common.h b/drivers/staging/dgrp/dgrp_common.h
index 2832b8e26c4b..23aba6c4d22c 100644
--- a/drivers/staging/dgrp/dgrp_common.h
+++ b/drivers/staging/dgrp/dgrp_common.h
@@ -49,20 +49,20 @@ extern struct dgrp_poll_data dgrp_poll_data;
extern void dgrp_poll_handler(unsigned long arg);
/* from dgrp_mon_ops.c */
-extern void dgrp_register_mon_hook(struct proc_dir_entry *de);
+extern const struct file_operations dgrp_mon_ops;
/* from dgrp_tty.c */
extern int dgrp_tty_init(struct nd_struct *nd);
extern void dgrp_tty_uninit(struct nd_struct *nd);
/* from dgrp_ports_ops.c */
-extern void dgrp_register_ports_hook(struct proc_dir_entry *de);
+extern const struct file_operations dgrp_ports_ops;
/* from dgrp_net_ops.c */
-extern void dgrp_register_net_hook(struct proc_dir_entry *de);
+extern const struct file_operations dgrp_net_ops;
/* from dgrp_dpa_ops.c */
-extern void dgrp_register_dpa_hook(struct proc_dir_entry *de);
+extern const struct file_operations dgrp_dpa_ops;
extern void dgrp_dpa_data(struct nd_struct *, int, u8 *, int);
/* from dgrp_sysfs.c */
@@ -76,61 +76,6 @@ extern void dgrp_create_tty_sysfs(struct un_struct *un, struct device *c);
extern void dgrp_remove_tty_sysfs(struct device *c);
/* from dgrp_specproc.c */
-/*
- * The list of DGRP entries with r/w capabilities. These
- * magic numbers are used for identification purposes.
- */
-enum {
- DGRP_CONFIG = 1, /* Configure portservers */
- DGRP_NETDIR = 2, /* Directory for "net" devices */
- DGRP_MONDIR = 3, /* Directory for "mon" devices */
- DGRP_PORTSDIR = 4, /* Directory for "ports" devices */
- DGRP_INFO = 5, /* Get info. about the running module */
- DGRP_NODEINFO = 6, /* Get info. about the configured nodes */
- DGRP_DPADIR = 7, /* Directory for the "dpa" devices */
-};
-
-/*
- * Directions for proc handlers
- */
-enum {
- INBOUND = 1, /* Data being written to kernel */
- OUTBOUND = 2, /* Data being read from the kernel */
-};
-
-/**
- * dgrp_proc_entry: structure for dgrp proc dirs
- * @id: ID number associated with this particular entry. Should be
- * unique across all of DGRP.
- * @name: text name associated with the /proc entry
- * @mode: file access permisssions for the /proc entry
- * @child: pointer to table describing a subdirectory for this entry
- * @de: pointer to directory entry for this object once registered. Used
- * to grab the handle of the object for unregistration
- * @excl_sem: semaphore to provide exclusive to struct
- * @excl_cnt: counter of current accesses
- *
- * Each entry in a DGRP proc directory is described with a
- * dgrp_proc_entry structure. A collection of these
- * entries (in an array) represents the members associated
- * with a particular /proc directory, and is referred to
- * as a table. All tables are terminated by an entry with
- * zeros for every member.
- */
-struct dgrp_proc_entry {
- int id; /* Integer identifier */
- const char *name; /* ASCII identifier */
- mode_t mode; /* File access permissions */
- struct dgrp_proc_entry *child; /* Child pointer */
-
- /* file ops to use, pass NULL to use default */
- struct file_operations *proc_file_ops;
-
- struct proc_dir_entry *de; /* proc entry pointer */
- struct semaphore excl_sem; /* Protects exclusive access var */
- int excl_cnt; /* Counts number of curr accesses */
-};
-
extern void dgrp_unregister_proc(void);
extern void dgrp_register_proc(void);
@@ -144,8 +89,6 @@ extern void dgrp_register_proc(void);
*-----------------------------------------------------------------------*/
void dgrp_carrier(struct ch_struct *ch);
-extern int dgrp_inode_permission(struct inode *inode, int op);
-extern int dgrp_chk_perm(int mode, int op);
/*
diff --git a/drivers/staging/dgrp/dgrp_dpa_ops.c b/drivers/staging/dgrp/dgrp_dpa_ops.c
index ca10a3362e29..114799cddd85 100644
--- a/drivers/staging/dgrp/dgrp_dpa_ops.c
+++ b/drivers/staging/dgrp/dgrp_dpa_ops.c
@@ -40,6 +40,7 @@
#include <linux/cred.h>
#include <linux/sched.h>
#include <linux/ratelimit.h>
+#include <linux/slab.h>
#include <asm/unaligned.h>
#include "dgrp_common.h"
@@ -52,7 +53,7 @@ static long dgrp_dpa_ioctl(struct file *file, unsigned int cmd,
unsigned long arg);
static unsigned int dgrp_dpa_select(struct file *, struct poll_table_struct *);
-static const struct file_operations dpa_ops = {
+const struct file_operations dgrp_dpa_ops = {
.owner = THIS_MODULE,
.read = dgrp_dpa_read,
.poll = dgrp_dpa_select,
@@ -61,12 +62,6 @@ static const struct file_operations dpa_ops = {
.release = dgrp_dpa_release,
};
-static struct inode_operations dpa_inode_ops = {
- .permission = dgrp_inode_permission
-};
-
-
-
struct digi_node {
uint nd_state; /* Node state: 1 = up, 0 = down. */
uint nd_chan_count; /* Number of channels found */
@@ -111,17 +106,6 @@ struct digi_debug {
#define DIGI_SETDEBUG (('d'<<8) | 247) /* set debug info */
-void dgrp_register_dpa_hook(struct proc_dir_entry *de)
-{
- struct nd_struct *node = de->data;
-
- de->proc_iops = &dpa_inode_ops;
- rcu_assign_pointer(de->proc_fops, &dpa_ops);
-
- node->nd_dpa_de = de;
- spin_lock_init(&node->nd_dpa_lock);
-}
-
/*
* dgrp_dpa_open -- open the DPA device for a particular PortServer
*/
@@ -130,8 +114,6 @@ static int dgrp_dpa_open(struct inode *inode, struct file *file)
struct nd_struct *nd;
int rtn = 0;
- struct proc_dir_entry *de;
-
rtn = try_module_get(THIS_MODULE);
if (!rtn)
return -ENXIO;
@@ -154,12 +136,7 @@ static int dgrp_dpa_open(struct inode *inode, struct file *file)
/*
* Get the node pointer, and fail if it doesn't exist.
*/
- de = PDE(inode);
- if (!de) {
- rtn = -ENXIO;
- goto done;
- }
- nd = (struct nd_struct *)de->data;
+ nd = PDE_DATA(inode);
if (!nd) {
rtn = -ENXIO;
goto done;
diff --git a/drivers/staging/dgrp/dgrp_mon_ops.c b/drivers/staging/dgrp/dgrp_mon_ops.c
index b484fccb494e..d18be4180e3b 100644
--- a/drivers/staging/dgrp/dgrp_mon_ops.c
+++ b/drivers/staging/dgrp/dgrp_mon_ops.c
@@ -37,6 +37,7 @@
#include <linux/tty.h>
#include <linux/sched.h>
#include <asm/unaligned.h>
+#include <linux/slab.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h>
@@ -49,7 +50,7 @@ static ssize_t dgrp_mon_read(struct file *, char __user *, size_t, loff_t *);
static long dgrp_mon_ioctl(struct file *file, unsigned int cmd,
unsigned long arg);
-static const struct file_operations mon_ops = {
+const struct file_operations dgrp_mon_ops = {
.owner = THIS_MODULE,
.read = dgrp_mon_read,
.unlocked_ioctl = dgrp_mon_ioctl,
@@ -57,20 +58,6 @@ static const struct file_operations mon_ops = {
.release = dgrp_mon_release,
};
-static struct inode_operations mon_inode_ops = {
- .permission = dgrp_inode_permission
-};
-
-void dgrp_register_mon_hook(struct proc_dir_entry *de)
-{
- struct nd_struct *node = de->data;
-
- de->proc_iops = &mon_inode_ops;
- rcu_assign_pointer(de->proc_fops, &mon_ops);
- node->nd_mon_de = de;
- sema_init(&node->nd_mon_semaphore, 1);
-}
-
/**
* dgrp_mon_open() -- open /proc/dgrp/ports device for a PortServer
* @inode: struct inode *
@@ -81,7 +68,6 @@ void dgrp_register_mon_hook(struct proc_dir_entry *de)
static int dgrp_mon_open(struct inode *inode, struct file *file)
{
struct nd_struct *nd;
- struct proc_dir_entry *de;
struct timeval tv;
uint32_t time;
u8 *buf;
@@ -109,13 +95,7 @@ static int dgrp_mon_open(struct inode *inode, struct file *file)
/*
* Get the node pointer, and fail if it doesn't exist.
*/
- de = PDE(inode);
- if (!de) {
- rtn = -ENXIO;
- goto done;
- }
-
- nd = (struct nd_struct *)de->data;
+ nd = PDE_DATA(inode);
if (!nd) {
rtn = -ENXIO;
goto done;
diff --git a/drivers/staging/dgrp/dgrp_net_ops.c b/drivers/staging/dgrp/dgrp_net_ops.c
index 64f48ffb9d4e..5b7833f593ff 100644
--- a/drivers/staging/dgrp/dgrp_net_ops.c
+++ b/drivers/staging/dgrp/dgrp_net_ops.c
@@ -35,7 +35,7 @@
#include <linux/module.h>
#include <linux/proc_fs.h>
-#include <linux/types.h>
+#include <linux/slab.h>
#include <linux/string.h>
#include <linux/device.h>
#include <linux/tty.h>
@@ -72,7 +72,7 @@ static long dgrp_net_ioctl(struct file *file, unsigned int cmd,
static unsigned int dgrp_net_select(struct file *file,
struct poll_table_struct *table);
-static const struct file_operations net_ops = {
+const struct file_operations dgrp_net_ops = {
.owner = THIS_MODULE,
.read = dgrp_net_read,
.write = dgrp_net_write,
@@ -82,23 +82,6 @@ static const struct file_operations net_ops = {
.release = dgrp_net_release,
};
-static struct inode_operations net_inode_ops = {
- .permission = dgrp_inode_permission
-};
-
-void dgrp_register_net_hook(struct proc_dir_entry *de)
-{
- struct nd_struct *node = de->data;
-
- de->proc_iops = &net_inode_ops;
- rcu_assign_pointer(de->proc_fops, &net_ops);
- node->nd_net_de = de;
- sema_init(&node->nd_net_semaphore, 1);
- node->nd_state = NS_CLOSED;
- dgrp_create_node_class_sysfs_files(node);
-}
-
-
/**
* dgrp_dump() -- prints memory for debugging purposes.
* @mem: Memory location which should be printed to the console
@@ -801,7 +784,6 @@ out_err:
static int dgrp_net_open(struct inode *inode, struct file *file)
{
struct nd_struct *nd;
- struct proc_dir_entry *de;
ulong lock_flags;
int rtn;
@@ -825,13 +807,7 @@ static int dgrp_net_open(struct inode *inode, struct file *file)
/*
* Get the node pointer, and fail if it doesn't exist.
*/
- de = PDE(inode);
- if (!de) {
- rtn = -ENXIO;
- goto done;
- }
-
- nd = (struct nd_struct *) de->data;
+ nd = PDE_DATA(inode);
if (!nd) {
rtn = -ENXIO;
goto done;
diff --git a/drivers/staging/dgrp/dgrp_ports_ops.c b/drivers/staging/dgrp/dgrp_ports_ops.c
index f93dc1f262f5..4ce030815f27 100644
--- a/drivers/staging/dgrp/dgrp_ports_ops.c
+++ b/drivers/staging/dgrp/dgrp_ports_ops.c
@@ -47,7 +47,7 @@
/* File operation declarations */
static int dgrp_ports_open(struct inode *, struct file *);
-static const struct file_operations ports_ops = {
+const struct file_operations dgrp_ports_ops = {
.owner = THIS_MODULE,
.open = dgrp_ports_open,
.read = seq_read,
@@ -55,20 +55,6 @@ static const struct file_operations ports_ops = {
.release = seq_release
};
-static struct inode_operations ports_inode_ops = {
- .permission = dgrp_inode_permission
-};
-
-
-void dgrp_register_ports_hook(struct proc_dir_entry *de)
-{
- struct nd_struct *node = de->data;
-
- de->proc_iops = &ports_inode_ops;
- rcu_assign_pointer(de->proc_fops, &ports_ops);
- node->nd_ports_de = de;
-}
-
static void *dgrp_ports_seq_start(struct seq_file *seq, loff_t *pos)
{
if (*pos == 0)
@@ -163,7 +149,7 @@ static int dgrp_ports_open(struct inode *inode, struct file *file)
rtn = seq_open(file, &ports_seq_ops);
if (!rtn) {
seq = file->private_data;
- seq->private = PDE(inode)->data;
+ seq->private = PDE_DATA(inode);
}
return rtn;
diff --git a/drivers/staging/dgrp/dgrp_specproc.c b/drivers/staging/dgrp/dgrp_specproc.c
index d66712c8aa94..205d80ef4455 100644
--- a/drivers/staging/dgrp/dgrp_specproc.c
+++ b/drivers/staging/dgrp/dgrp_specproc.c
@@ -37,6 +37,7 @@
#include <linux/sched.h>
#include <linux/cred.h>
#include <linux/proc_fs.h>
+#include <linux/slab.h>
#include <linux/ctype.h>
#include <linux/seq_file.h>
#include <linux/uaccess.h>
@@ -44,43 +45,17 @@
#include "dgrp_common.h"
-static struct dgrp_proc_entry dgrp_table[];
static struct proc_dir_entry *dgrp_proc_dir_entry;
static int dgrp_add_id(long id);
static int dgrp_remove_nd(struct nd_struct *nd);
-static void unregister_dgrp_device(struct proc_dir_entry *de);
-static void register_dgrp_device(struct nd_struct *node,
+static struct proc_dir_entry *add_proc_file(struct nd_struct *node,
struct proc_dir_entry *root,
- void (*register_hook)(struct proc_dir_entry *de));
+ const struct file_operations *fops);
/* File operation declarations */
-static int dgrp_gen_proc_open(struct inode *, struct file *);
-static int dgrp_gen_proc_close(struct inode *, struct file *);
static int parse_write_config(char *);
-
-static const struct file_operations dgrp_proc_file_ops = {
- .owner = THIS_MODULE,
- .open = dgrp_gen_proc_open,
- .release = dgrp_gen_proc_close,
-};
-
-static struct inode_operations proc_inode_ops = {
- .permission = dgrp_inode_permission
-};
-
-
-static void register_proc_table(struct dgrp_proc_entry *,
- struct proc_dir_entry *);
-static void unregister_proc_table(struct dgrp_proc_entry *,
- struct proc_dir_entry *);
-
-static struct dgrp_proc_entry dgrp_net_table[];
-static struct dgrp_proc_entry dgrp_mon_table[];
-static struct dgrp_proc_entry dgrp_ports_table[];
-static struct dgrp_proc_entry dgrp_dpa_table[];
-
static ssize_t dgrp_config_proc_write(struct file *file,
const char __user *buffer,
size_t count, loff_t *pos);
@@ -89,7 +64,7 @@ static int dgrp_nodeinfo_proc_open(struct inode *inode, struct file *file);
static int dgrp_info_proc_open(struct inode *inode, struct file *file);
static int dgrp_config_proc_open(struct inode *inode, struct file *file);
-static struct file_operations config_proc_file_ops = {
+static const struct file_operations config_proc_file_ops = {
.owner = THIS_MODULE,
.open = dgrp_config_proc_open,
.read = seq_read,
@@ -98,7 +73,7 @@ static struct file_operations config_proc_file_ops = {
.write = dgrp_config_proc_write,
};
-static struct file_operations info_proc_file_ops = {
+static const struct file_operations info_proc_file_ops = {
.owner = THIS_MODULE,
.open = dgrp_info_proc_open,
.read = seq_read,
@@ -106,7 +81,7 @@ static struct file_operations info_proc_file_ops = {
.release = single_release,
};
-static struct file_operations nodeinfo_proc_file_ops = {
+static const struct file_operations nodeinfo_proc_file_ops = {
.owner = THIS_MODULE,
.open = dgrp_nodeinfo_proc_open,
.read = seq_read,
@@ -114,71 +89,25 @@ static struct file_operations nodeinfo_proc_file_ops = {
.release = seq_release,
};
-static struct dgrp_proc_entry dgrp_table[] = {
- {
- .id = DGRP_CONFIG,
- .name = "config",
- .mode = 0644,
- .proc_file_ops = &config_proc_file_ops,
- },
- {
- .id = DGRP_INFO,
- .name = "info",
- .mode = 0644,
- .proc_file_ops = &info_proc_file_ops,
- },
- {
- .id = DGRP_NODEINFO,
- .name = "nodeinfo",
- .mode = 0644,
- .proc_file_ops = &nodeinfo_proc_file_ops,
- },
- {
- .id = DGRP_NETDIR,
- .name = "net",
- .mode = 0500,
- .child = dgrp_net_table
- },
- {
- .id = DGRP_MONDIR,
- .name = "mon",
- .mode = 0500,
- .child = dgrp_mon_table
- },
- {
- .id = DGRP_PORTSDIR,
- .name = "ports",
- .mode = 0500,
- .child = dgrp_ports_table
- },
- {
- .id = DGRP_DPADIR,
- .name = "dpa",
- .mode = 0500,
- .child = dgrp_dpa_table
- }
-};
-
static struct proc_dir_entry *net_entry_pointer;
static struct proc_dir_entry *mon_entry_pointer;
static struct proc_dir_entry *dpa_entry_pointer;
static struct proc_dir_entry *ports_entry_pointer;
-static struct dgrp_proc_entry dgrp_net_table[] = {
- {0}
-};
-
-static struct dgrp_proc_entry dgrp_mon_table[] = {
- {0}
-};
-
-static struct dgrp_proc_entry dgrp_ports_table[] = {
- {0}
-};
-
-static struct dgrp_proc_entry dgrp_dpa_table[] = {
- {0}
-};
+static void remove_files(struct nd_struct *nd)
+{
+ char buf[3];
+ ID_TO_CHAR(nd->nd_ID, buf);
+ dgrp_remove_node_class_sysfs_files(nd);
+ if (nd->nd_net_de)
+ remove_proc_entry(buf, net_entry_pointer);
+ if (nd->nd_mon_de)
+ remove_proc_entry(buf, mon_entry_pointer);
+ if (nd->nd_dpa_de)
+ remove_proc_entry(buf, dpa_entry_pointer);
+ if (nd->nd_ports_de)
+ remove_proc_entry(buf, ports_entry_pointer);
+}
void dgrp_unregister_proc(void)
{
@@ -188,12 +117,19 @@ void dgrp_unregister_proc(void)
ports_entry_pointer = NULL;
if (dgrp_proc_dir_entry) {
- unregister_proc_table(dgrp_table, dgrp_proc_dir_entry);
- remove_proc_entry(dgrp_proc_dir_entry->name,
- dgrp_proc_dir_entry->parent);
+ struct nd_struct *nd;
+ list_for_each_entry(nd, &nd_struct_list, list)
+ remove_files(nd);
+ remove_proc_entry("dgrp/config", NULL);
+ remove_proc_entry("dgrp/info", NULL);
+ remove_proc_entry("dgrp/nodeinfo", NULL);
+ remove_proc_entry("dgrp/net", NULL);
+ remove_proc_entry("dgrp/mon", NULL);
+ remove_proc_entry("dgrp/dpa", NULL);
+ remove_proc_entry("dgrp/ports", NULL);
+ remove_proc_entry("dgrp", NULL);
dgrp_proc_dir_entry = NULL;
}
-
}
void dgrp_register_proc(void)
@@ -201,211 +137,16 @@ void dgrp_register_proc(void)
/*
* Register /proc/dgrp
*/
- dgrp_proc_dir_entry = proc_create("dgrp", S_IFDIR, NULL,
- &dgrp_proc_file_ops);
- register_proc_table(dgrp_table, dgrp_proc_dir_entry);
-}
-
-/*
- * /proc/sys support
- */
-static int dgrp_proc_match(int len, const char *name, struct proc_dir_entry *de)
-{
- if (!de || !de->low_ino)
- return 0;
- if (de->namelen != len)
- return 0;
- return !memcmp(name, de->name, len);
-}
-
-
-/*
- * Scan the entries in table and add them all to /proc at the position
- * referred to by "root"
- */
-static void register_proc_table(struct dgrp_proc_entry *table,
- struct proc_dir_entry *root)
-{
- struct proc_dir_entry *de;
- int len;
- mode_t mode;
-
- if (table == NULL)
+ dgrp_proc_dir_entry = proc_mkdir("dgrp", NULL);
+ if (!dgrp_proc_dir_entry)
return;
- if (root == NULL)
- return;
-
- for (; table->id; table++) {
- /* Can't do anything without a proc name. */
- if (!table->name)
- continue;
-
- /* Maybe we can't do anything with it... */
- if (!table->proc_file_ops &&
- !table->child) {
- pr_warn("dgrp: Can't register %s\n",
- table->name);
- continue;
- }
-
- len = strlen(table->name);
- mode = table->mode;
-
- de = NULL;
- if (!table->child)
- mode |= S_IFREG;
- else {
- mode |= S_IFDIR;
- for (de = root->subdir; de; de = de->next) {
- if (dgrp_proc_match(len, table->name, de))
- break;
- }
- /* If the subdir exists already, de is non-NULL */
- }
-
- if (!de) {
- de = create_proc_entry(table->name, mode, root);
- if (!de)
- continue;
- de->data = (void *) table;
- if (!table->child) {
- de->proc_iops = &proc_inode_ops;
- if (table->proc_file_ops)
- rcu_assign_pointer(de->proc_fops,
- table->proc_file_ops);
- else
- rcu_assign_pointer(de->proc_fops,
- &dgrp_proc_file_ops);
- }
- }
- table->de = de;
- if (de->mode & S_IFDIR)
- register_proc_table(table->child, de);
-
- if (table->id == DGRP_NETDIR)
- net_entry_pointer = de;
-
- if (table->id == DGRP_MONDIR)
- mon_entry_pointer = de;
-
- if (table->id == DGRP_DPADIR)
- dpa_entry_pointer = de;
-
- if (table->id == DGRP_PORTSDIR)
- ports_entry_pointer = de;
- }
-}
-
-/*
- * Unregister a /proc sysctl table and any subdirectories.
- */
-static void unregister_proc_table(struct dgrp_proc_entry *table,
- struct proc_dir_entry *root)
-{
- struct proc_dir_entry *de;
- struct nd_struct *tmp;
-
- if (table == NULL)
- return;
-
- list_for_each_entry(tmp, &nd_struct_list, list) {
- if ((table == dgrp_net_table) && (tmp->nd_net_de)) {
- unregister_dgrp_device(tmp->nd_net_de);
- dgrp_remove_node_class_sysfs_files(tmp);
- }
-
- if ((table == dgrp_mon_table) && (tmp->nd_mon_de))
- unregister_dgrp_device(tmp->nd_mon_de);
-
- if ((table == dgrp_dpa_table) && (tmp->nd_dpa_de))
- unregister_dgrp_device(tmp->nd_dpa_de);
-
- if ((table == dgrp_ports_table) && (tmp->nd_ports_de))
- unregister_dgrp_device(tmp->nd_ports_de);
- }
-
- for (; table->id; table++) {
- de = table->de;
-
- if (!de)
- continue;
- if (de->mode & S_IFDIR) {
- if (!table->child) {
- pr_alert("dgrp: malformed sysctl tree on free\n");
- continue;
- }
- unregister_proc_table(table->child, de);
-
- /* Don't unregister directories which still have entries */
- if (de->subdir)
- continue;
- }
-
- /* Don't unregister proc entries that are still being used.. */
- if ((atomic_read(&de->count)) != 1) {
- pr_alert("proc entry %s in use, not removing\n",
- de->name);
- continue;
- }
-
- remove_proc_entry(de->name, de->parent);
- table->de = NULL;
- }
-}
-
-static int dgrp_gen_proc_open(struct inode *inode, struct file *file)
-{
- struct proc_dir_entry *de;
- struct dgrp_proc_entry *entry;
- int ret = 0;
-
- de = (struct proc_dir_entry *) PDE(file_inode(file));
- if (!de || !de->data) {
- ret = -ENXIO;
- goto done;
- }
-
- entry = (struct dgrp_proc_entry *) de->data;
- if (!entry) {
- ret = -ENXIO;
- goto done;
- }
-
- down(&entry->excl_sem);
-
- if (entry->excl_cnt)
- ret = -EBUSY;
- else
- entry->excl_cnt++;
-
- up(&entry->excl_sem);
-
-done:
- return ret;
-}
-
-static int dgrp_gen_proc_close(struct inode *inode, struct file *file)
-{
- struct proc_dir_entry *de;
- struct dgrp_proc_entry *entry;
-
- de = (struct proc_dir_entry *) PDE(file_inode(file));
- if (!de || !de->data)
- goto done;
-
- entry = (struct dgrp_proc_entry *) de->data;
- if (!entry)
- goto done;
-
- down(&entry->excl_sem);
-
- if (entry->excl_cnt)
- entry->excl_cnt = 0;
-
- up(&entry->excl_sem);
-
-done:
- return 0;
+ proc_create("dgrp/config", 0644, NULL, &config_proc_file_ops);
+ proc_create("dgrp/info", 0644, NULL, &info_proc_file_ops);
+ proc_create("dgrp/nodeinfo", 0644, NULL, &nodeinfo_proc_file_ops);
+ net_entry_pointer = proc_mkdir_mode("dgrp/net", 0500, NULL);
+ mon_entry_pointer = proc_mkdir_mode("dgrp/mon", 0500, NULL);
+ dpa_entry_pointer = proc_mkdir_mode("dgrp/dpa", 0500, NULL);
+ ports_entry_pointer = proc_mkdir_mode("dgrp/ports", 0500, NULL);
}
static void *dgrp_config_proc_start(struct seq_file *m, loff_t *pos)
@@ -736,6 +477,10 @@ static int dgrp_add_id(long id)
init_waitqueue_head(&nd->nd_tx_waitq);
init_waitqueue_head(&nd->nd_mon_wqueue);
init_waitqueue_head(&nd->nd_dpa_wqueue);
+ sema_init(&nd->nd_mon_semaphore, 1);
+ sema_init(&nd->nd_net_semaphore, 1);
+ spin_lock_init(&nd->nd_dpa_lock);
+ nd->nd_state = NS_CLOSED;
for (i = 0; i < SEQ_MAX; i++)
init_waitqueue_head(&nd->nd_seq_wque[i]);
@@ -750,12 +495,12 @@ static int dgrp_add_id(long id)
if (ret)
goto error_out;
- register_dgrp_device(nd, net_entry_pointer, dgrp_register_net_hook);
- register_dgrp_device(nd, mon_entry_pointer, dgrp_register_mon_hook);
- register_dgrp_device(nd, dpa_entry_pointer, dgrp_register_dpa_hook);
- register_dgrp_device(nd, ports_entry_pointer,
- dgrp_register_ports_hook);
-
+ dgrp_create_node_class_sysfs_files(nd);
+ nd->nd_net_de = add_proc_file(nd, net_entry_pointer, &dgrp_net_ops);
+ nd->nd_mon_de = add_proc_file(nd, mon_entry_pointer, &dgrp_mon_ops);
+ nd->nd_dpa_de = add_proc_file(nd, dpa_entry_pointer, &dgrp_dpa_ops);
+ nd->nd_ports_de = add_proc_file(nd, ports_entry_pointer,
+ &dgrp_ports_ops);
return 0;
/* FIXME this guy should free the tty driver stored in nd and destroy
@@ -774,16 +519,7 @@ static int dgrp_remove_nd(struct nd_struct *nd)
if (nd->nd_tty_ref_cnt)
return -EBUSY;
- if (nd->nd_net_de) {
- unregister_dgrp_device(nd->nd_net_de);
- dgrp_remove_node_class_sysfs_files(nd);
- }
-
- unregister_dgrp_device(nd->nd_mon_de);
-
- unregister_dgrp_device(nd->nd_ports_de);
-
- unregister_dgrp_device(nd->nd_dpa_de);
+ remove_files(nd);
dgrp_tty_uninit(nd);
@@ -795,38 +531,11 @@ static int dgrp_remove_nd(struct nd_struct *nd)
return 0;
}
-static void register_dgrp_device(struct nd_struct *node,
+static struct proc_dir_entry *add_proc_file(struct nd_struct *node,
struct proc_dir_entry *root,
- void (*register_hook)(struct proc_dir_entry *de))
+ const struct file_operations *fops)
{
char buf[3];
- struct proc_dir_entry *de;
-
ID_TO_CHAR(node->nd_ID, buf);
-
- de = create_proc_entry(buf, 0600 | S_IFREG, root);
- if (!de)
- return;
-
- de->data = (void *) node;
-
- if (register_hook)
- register_hook(de);
-
-}
-
-static void unregister_dgrp_device(struct proc_dir_entry *de)
-{
- if (!de)
- return;
-
- /* Don't unregister proc entries that are still being used.. */
- if ((atomic_read(&de->count)) != 1) {
- pr_alert("%s - proc entry %s in use. Not removing.\n",
- __func__, de->name);
- return;
- }
-
- remove_proc_entry(de->name, de->parent);
- de = NULL;
+ return proc_create_data(buf, 0600, root, fops, node);
}