afs: simplify procfs code
authorChristoph Hellwig <hch@lst.de>
Fri, 13 Apr 2018 18:45:09 +0000 (20:45 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 16 May 2018 05:24:30 +0000 (07:24 +0200)
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: Christoph Hellwig <hch@lst.de>
fs/afs/proc.c

index 839a22280606e9472e8b237853fb232577685652..3aad32762989434798e02e6cf365a8211b8348c9 100644 (file)
@@ -62,7 +62,6 @@ static const struct file_operations afs_proc_rootcell_fops = {
        .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_next(struct seq_file *p, void *v,
                                        loff_t *pos);
@@ -76,15 +75,6 @@ static const struct seq_operations afs_proc_cell_volumes_ops = {
        .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_next(struct seq_file *p, void *v,
                                          loff_t *pos);
@@ -98,14 +88,6 @@ static const struct seq_operations afs_proc_cell_vlservers_ops = {
        .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_next(struct seq_file *p, void *v,
                                        loff_t *pos);
@@ -119,13 +101,6 @@ static const struct seq_operations afs_proc_servers_ops = {
        .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_release(struct inode *inode, struct file *file);
 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 = {
        .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
@@ -167,8 +142,8 @@ int afs_proc_init(struct afs_net *net)
 
        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("servers", 0644, net->proc_afs, &afs_proc_servers_fops) ||
-           !proc_create("stats", 0644, net->proc_afs, &afs_proc_stats_fops) ||
+           !proc_create_seq("servers", 0644, net->proc_afs, &afs_proc_servers_ops) ||
+           !proc_create_single("stats", 0644, net->proc_afs, afs_proc_stats_show) ||
            !proc_create("sysname", 0644, net->proc_afs, &afs_proc_sysname_fops))
                goto error_tree;
 
@@ -196,16 +171,7 @@ void afs_proc_cleanup(struct afs_net *net)
  */
 static int afs_proc_cells_open(struct inode *inode, struct file *file)
 {
-       struct seq_file *m;
-       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;
+       return seq_open(file, &afs_proc_cells_ops);
 }
 
 /*
@@ -430,10 +396,11 @@ int afs_proc_cell_setup(struct afs_net *net, struct afs_cell *cell)
        if (!dir)
                goto error_dir;
 
-       if (!proc_create_data("vlservers", 0, dir,
-                             &afs_proc_cell_vlservers_fops, cell) ||
-           !proc_create_data("volumes", 0, dir,
-                             &afs_proc_cell_volumes_fops, cell))
+       if (!proc_create_seq_data("vlservers", 0, dir,
+                       &afs_proc_cell_vlservers_ops, cell))
+               goto error_tree;
+       if (!proc_create_seq_data("volumes", 0, dir, &afs_proc_cell_volumes_ops,
+                       cell))
                goto error_tree;
 
        _leave(" = 0");
@@ -458,29 +425,6 @@ void afs_proc_cell_remove(struct afs_net *net, struct afs_cell *cell)
        _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
  * first item
@@ -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)
        __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);
 
@@ -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,
                                        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);
        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,
 static void afs_proc_cell_volumes_stop(struct seq_file *p, void *v)
        __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);
 }
@@ -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)
 {
-       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);
 
        /* Display header on line 1 */
@@ -546,30 +490,6 @@ static int afs_proc_cell_volumes_show(struct seq_file *m, void *v)
        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
  * first item
@@ -578,7 +498,7 @@ static void *afs_proc_cell_vlservers_start(struct seq_file *m, loff_t *_pos)
        __acquires(rcu)
 {
        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;
 
        rcu_read_lock();
@@ -603,7 +523,7 @@ static void *afs_proc_cell_vlservers_next(struct seq_file *p, void *v,
                                          loff_t *_pos)
 {
        struct afs_addr_list *alist;
-       struct afs_cell *cell = p->private;
+       struct afs_cell *cell = PDE_DATA(file_inode(p->file));
        loff_t pos;
 
        alist = rcu_dereference(cell->vl_addrs);
@@ -643,15 +563,6 @@ static int afs_proc_cell_vlservers_show(struct seq_file *m, void *v)
        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
  * first item.
@@ -931,18 +842,3 @@ static int afs_proc_stats_show(struct seq_file *m, void *v)
                   atomic_long_read(&net->n_store_bytes));
        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,
-};