Commit 353861cf authored by Christoph Hellwig's avatar Christoph Hellwig

afs: simplify procfs code

Use remove_proc_subtree to remove the whole subtree on cleanup, and
unwind the registration loop into individual calls.  Switch to use
proc_create_seq where applicable.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent b8b1483d
...@@ -62,7 +62,6 @@ static const struct file_operations afs_proc_rootcell_fops = { ...@@ -62,7 +62,6 @@ static const struct file_operations afs_proc_rootcell_fops = {
.llseek = no_llseek, .llseek = no_llseek,
}; };
static int afs_proc_cell_volumes_open(struct inode *inode, struct file *file);
static void *afs_proc_cell_volumes_start(struct seq_file *p, loff_t *pos); static void *afs_proc_cell_volumes_start(struct seq_file *p, loff_t *pos);
static void *afs_proc_cell_volumes_next(struct seq_file *p, void *v, static void *afs_proc_cell_volumes_next(struct seq_file *p, void *v,
loff_t *pos); loff_t *pos);
...@@ -76,15 +75,6 @@ static const struct seq_operations afs_proc_cell_volumes_ops = { ...@@ -76,15 +75,6 @@ static const struct seq_operations afs_proc_cell_volumes_ops = {
.show = afs_proc_cell_volumes_show, .show = afs_proc_cell_volumes_show,
}; };
static const struct file_operations afs_proc_cell_volumes_fops = {
.open = afs_proc_cell_volumes_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
static int afs_proc_cell_vlservers_open(struct inode *inode,
struct file *file);
static void *afs_proc_cell_vlservers_start(struct seq_file *p, loff_t *pos); static void *afs_proc_cell_vlservers_start(struct seq_file *p, loff_t *pos);
static void *afs_proc_cell_vlservers_next(struct seq_file *p, void *v, static void *afs_proc_cell_vlservers_next(struct seq_file *p, void *v,
loff_t *pos); loff_t *pos);
...@@ -98,14 +88,6 @@ static const struct seq_operations afs_proc_cell_vlservers_ops = { ...@@ -98,14 +88,6 @@ static const struct seq_operations afs_proc_cell_vlservers_ops = {
.show = afs_proc_cell_vlservers_show, .show = afs_proc_cell_vlservers_show,
}; };
static const struct file_operations afs_proc_cell_vlservers_fops = {
.open = afs_proc_cell_vlservers_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
static int afs_proc_servers_open(struct inode *inode, struct file *file);
static void *afs_proc_servers_start(struct seq_file *p, loff_t *pos); static void *afs_proc_servers_start(struct seq_file *p, loff_t *pos);
static void *afs_proc_servers_next(struct seq_file *p, void *v, static void *afs_proc_servers_next(struct seq_file *p, void *v,
loff_t *pos); loff_t *pos);
...@@ -119,13 +101,6 @@ static const struct seq_operations afs_proc_servers_ops = { ...@@ -119,13 +101,6 @@ static const struct seq_operations afs_proc_servers_ops = {
.show = afs_proc_servers_show, .show = afs_proc_servers_show,
}; };
static const struct file_operations afs_proc_servers_fops = {
.open = afs_proc_servers_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
static int afs_proc_sysname_open(struct inode *inode, struct file *file); static int afs_proc_sysname_open(struct inode *inode, struct file *file);
static int afs_proc_sysname_release(struct inode *inode, struct file *file); static int afs_proc_sysname_release(struct inode *inode, struct file *file);
static void *afs_proc_sysname_start(struct seq_file *p, loff_t *pos); static void *afs_proc_sysname_start(struct seq_file *p, loff_t *pos);
...@@ -152,7 +127,7 @@ static const struct file_operations afs_proc_sysname_fops = { ...@@ -152,7 +127,7 @@ static const struct file_operations afs_proc_sysname_fops = {
.write = afs_proc_sysname_write, .write = afs_proc_sysname_write,
}; };
static const struct file_operations afs_proc_stats_fops; static int afs_proc_stats_show(struct seq_file *m, void *v);
/* /*
* initialise the /proc/fs/afs/ directory * initialise the /proc/fs/afs/ directory
...@@ -167,8 +142,8 @@ int afs_proc_init(struct afs_net *net) ...@@ -167,8 +142,8 @@ int afs_proc_init(struct afs_net *net)
if (!proc_create("cells", 0644, net->proc_afs, &afs_proc_cells_fops) || if (!proc_create("cells", 0644, net->proc_afs, &afs_proc_cells_fops) ||
!proc_create("rootcell", 0644, net->proc_afs, &afs_proc_rootcell_fops) || !proc_create("rootcell", 0644, net->proc_afs, &afs_proc_rootcell_fops) ||
!proc_create("servers", 0644, net->proc_afs, &afs_proc_servers_fops) || !proc_create_seq("servers", 0644, net->proc_afs, &afs_proc_servers_ops) ||
!proc_create("stats", 0644, net->proc_afs, &afs_proc_stats_fops) || !proc_create_single("stats", 0644, net->proc_afs, afs_proc_stats_show) ||
!proc_create("sysname", 0644, net->proc_afs, &afs_proc_sysname_fops)) !proc_create("sysname", 0644, net->proc_afs, &afs_proc_sysname_fops))
goto error_tree; goto error_tree;
...@@ -196,16 +171,7 @@ void afs_proc_cleanup(struct afs_net *net) ...@@ -196,16 +171,7 @@ void afs_proc_cleanup(struct afs_net *net)
*/ */
static int afs_proc_cells_open(struct inode *inode, struct file *file) static int afs_proc_cells_open(struct inode *inode, struct file *file)
{ {
struct seq_file *m; return seq_open(file, &afs_proc_cells_ops);
int ret;
ret = seq_open(file, &afs_proc_cells_ops);
if (ret < 0)
return ret;
m = file->private_data;
m->private = PDE_DATA(inode);
return 0;
} }
/* /*
...@@ -430,10 +396,11 @@ int afs_proc_cell_setup(struct afs_net *net, struct afs_cell *cell) ...@@ -430,10 +396,11 @@ int afs_proc_cell_setup(struct afs_net *net, struct afs_cell *cell)
if (!dir) if (!dir)
goto error_dir; goto error_dir;
if (!proc_create_data("vlservers", 0, dir, if (!proc_create_seq_data("vlservers", 0, dir,
&afs_proc_cell_vlservers_fops, cell) || &afs_proc_cell_vlservers_ops, cell))
!proc_create_data("volumes", 0, dir, goto error_tree;
&afs_proc_cell_volumes_fops, cell)) if (!proc_create_seq_data("volumes", 0, dir, &afs_proc_cell_volumes_ops,
cell))
goto error_tree; goto error_tree;
_leave(" = 0"); _leave(" = 0");
...@@ -458,29 +425,6 @@ void afs_proc_cell_remove(struct afs_net *net, struct afs_cell *cell) ...@@ -458,29 +425,6 @@ void afs_proc_cell_remove(struct afs_net *net, struct afs_cell *cell)
_leave(""); _leave("");
} }
/*
* open "/proc/fs/afs/<cell>/volumes" which provides a summary of extant cells
*/
static int afs_proc_cell_volumes_open(struct inode *inode, struct file *file)
{
struct afs_cell *cell;
struct seq_file *m;
int ret;
cell = PDE_DATA(inode);
if (!cell)
return -ENOENT;
ret = seq_open(file, &afs_proc_cell_volumes_ops);
if (ret < 0)
return ret;
m = file->private_data;
m->private = cell;
return 0;
}
/* /*
* set up the iterator to start reading from the cells list and return the * set up the iterator to start reading from the cells list and return the
* first item * first item
...@@ -488,7 +432,7 @@ static int afs_proc_cell_volumes_open(struct inode *inode, struct file *file) ...@@ -488,7 +432,7 @@ static int afs_proc_cell_volumes_open(struct inode *inode, struct file *file)
static void *afs_proc_cell_volumes_start(struct seq_file *m, loff_t *_pos) static void *afs_proc_cell_volumes_start(struct seq_file *m, loff_t *_pos)
__acquires(cell->proc_lock) __acquires(cell->proc_lock)
{ {
struct afs_cell *cell = m->private; struct afs_cell *cell = PDE_DATA(file_inode(m->file));
_enter("cell=%p pos=%Ld", cell, *_pos); _enter("cell=%p pos=%Ld", cell, *_pos);
...@@ -502,7 +446,7 @@ static void *afs_proc_cell_volumes_start(struct seq_file *m, loff_t *_pos) ...@@ -502,7 +446,7 @@ static void *afs_proc_cell_volumes_start(struct seq_file *m, loff_t *_pos)
static void *afs_proc_cell_volumes_next(struct seq_file *p, void *v, static void *afs_proc_cell_volumes_next(struct seq_file *p, void *v,
loff_t *_pos) loff_t *_pos)
{ {
struct afs_cell *cell = p->private; struct afs_cell *cell = PDE_DATA(file_inode(p->file));
_enter("cell=%p pos=%Ld", cell, *_pos); _enter("cell=%p pos=%Ld", cell, *_pos);
return seq_list_next(v, &cell->proc_volumes, _pos); return seq_list_next(v, &cell->proc_volumes, _pos);
...@@ -514,7 +458,7 @@ static void *afs_proc_cell_volumes_next(struct seq_file *p, void *v, ...@@ -514,7 +458,7 @@ static void *afs_proc_cell_volumes_next(struct seq_file *p, void *v,
static void afs_proc_cell_volumes_stop(struct seq_file *p, void *v) static void afs_proc_cell_volumes_stop(struct seq_file *p, void *v)
__releases(cell->proc_lock) __releases(cell->proc_lock)
{ {
struct afs_cell *cell = p->private; struct afs_cell *cell = PDE_DATA(file_inode(p->file));
read_unlock(&cell->proc_lock); read_unlock(&cell->proc_lock);
} }
...@@ -530,7 +474,7 @@ static const char afs_vol_types[3][3] = { ...@@ -530,7 +474,7 @@ static const char afs_vol_types[3][3] = {
*/ */
static int afs_proc_cell_volumes_show(struct seq_file *m, void *v) static int afs_proc_cell_volumes_show(struct seq_file *m, void *v)
{ {
struct afs_cell *cell = m->private; struct afs_cell *cell = PDE_DATA(file_inode(m->file));
struct afs_volume *vol = list_entry(v, struct afs_volume, proc_link); struct afs_volume *vol = list_entry(v, struct afs_volume, proc_link);
/* Display header on line 1 */ /* Display header on line 1 */
...@@ -546,30 +490,6 @@ static int afs_proc_cell_volumes_show(struct seq_file *m, void *v) ...@@ -546,30 +490,6 @@ static int afs_proc_cell_volumes_show(struct seq_file *m, void *v)
return 0; return 0;
} }
/*
* open "/proc/fs/afs/<cell>/vlservers" which provides a list of volume
* location server
*/
static int afs_proc_cell_vlservers_open(struct inode *inode, struct file *file)
{
struct afs_cell *cell;
struct seq_file *m;
int ret;
cell = PDE_DATA(inode);
if (!cell)
return -ENOENT;
ret = seq_open(file, &afs_proc_cell_vlservers_ops);
if (ret<0)
return ret;
m = file->private_data;
m->private = cell;
return 0;
}
/* /*
* set up the iterator to start reading from the cells list and return the * set up the iterator to start reading from the cells list and return the
* first item * first item
...@@ -578,7 +498,7 @@ static void *afs_proc_cell_vlservers_start(struct seq_file *m, loff_t *_pos) ...@@ -578,7 +498,7 @@ static void *afs_proc_cell_vlservers_start(struct seq_file *m, loff_t *_pos)
__acquires(rcu) __acquires(rcu)
{ {
struct afs_addr_list *alist; struct afs_addr_list *alist;
struct afs_cell *cell = m->private; struct afs_cell *cell = PDE_DATA(file_inode(m->file));
loff_t pos = *_pos; loff_t pos = *_pos;
rcu_read_lock(); rcu_read_lock();
...@@ -603,7 +523,7 @@ static void *afs_proc_cell_vlservers_next(struct seq_file *p, void *v, ...@@ -603,7 +523,7 @@ static void *afs_proc_cell_vlservers_next(struct seq_file *p, void *v,
loff_t *_pos) loff_t *_pos)
{ {
struct afs_addr_list *alist; struct afs_addr_list *alist;
struct afs_cell *cell = p->private; struct afs_cell *cell = PDE_DATA(file_inode(p->file));
loff_t pos; loff_t pos;
alist = rcu_dereference(cell->vl_addrs); alist = rcu_dereference(cell->vl_addrs);
...@@ -643,15 +563,6 @@ static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v) ...@@ -643,15 +563,6 @@ static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v)
return 0; return 0;
} }
/*
* open "/proc/fs/afs/servers" which provides a summary of active
* servers
*/
static int afs_proc_servers_open(struct inode *inode, struct file *file)
{
return seq_open(file, &afs_proc_servers_ops);
}
/* /*
* Set up the iterator to start reading from the server list and return the * Set up the iterator to start reading from the server list and return the
* first item. * first item.
...@@ -931,18 +842,3 @@ static int afs_proc_stats_show(struct seq_file *m, void *v) ...@@ -931,18 +842,3 @@ static int afs_proc_stats_show(struct seq_file *m, void *v)
atomic_long_read(&net->n_store_bytes)); atomic_long_read(&net->n_store_bytes));
return 0; return 0;
} }
/*
* Open "/proc/fs/afs/stats" to allow reading of the stat counters.
*/
static int afs_proc_stats_open(struct inode *inode, struct file *file)
{
return single_open(file, afs_proc_stats_show, NULL);
}
static const struct file_operations afs_proc_stats_fops = {
.open = afs_proc_stats_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
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