proc: convert /proc/bus/nubus to seq_file interface
authorAlexey Dobriyan <adobriyan@sw.ru>
Tue, 29 Apr 2008 08:01:54 +0000 (01:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 Apr 2008 15:06:19 +0000 (08:06 -0700)
Signed-off-by: Alexey Dobriyan <adobriyan@sw.ru>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/nubus/proc.c

index cb83acef94790a69b8374d95a763c3f4b8010cdb..208dd12825bc4314be4bbba70a9c898d8b99ae92 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/kernel.h>
 #include <linux/nubus.h>
 #include <linux/proc_fs.h>
+#include <linux/seq_file.h>
 #include <linux/init.h>
 #include <linux/module.h>
 
 #include <asm/byteorder.h>
 
 static int
-get_nubus_dev_info(char *buf, char **start, off_t pos, int count)
+nubus_devices_proc_show(struct seq_file *m, void *v)
 {
        struct nubus_dev *dev = nubus_devices;
-       off_t at = 0;
-       int len, cnt;
 
-       cnt = 0;
-       while (dev && count > cnt) {
-               len = sprintf(buf, "%x\t%04x %04x %04x %04x",
+       while (dev) {
+               seq_printf(m, "%x\t%04x %04x %04x %04x",
                              dev->board->slot,
                              dev->category,
                              dev->type,
                              dev->dr_sw,
                              dev->dr_hw);
-               len += sprintf(buf+len,
-                              "\t%08lx",
-                              dev->board->slot_addr);
-               buf[len++] = '\n';
-               at += len;
-               if (at >= pos) {
-                       if (!*start) {
-                               *start = buf + (pos - (at - len));
-                               cnt = at - pos;
-                       } else
-                               cnt += len;
-                       buf += len;
-               }
+               seq_printf(m, "\t%08lx\n", dev->board->slot_addr);
                dev = dev->next;
        }
-       return (count > cnt) ? cnt : count;
+       return 0;
+}
+
+static int nubus_devices_proc_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, nubus_devices_proc_show, NULL);
 }
 
+static const struct file_operations nubus_devices_proc_fops = {
+       .owner          = THIS_MODULE,
+       .open           = nubus_devices_proc_open,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
 static struct proc_dir_entry *proc_bus_nubus_dir;
 
 static void nubus_proc_subdir(struct nubus_dev* dev,
@@ -172,7 +171,6 @@ void __init nubus_proc_init(void)
        if (!MACH_IS_MAC)
                return;
        proc_bus_nubus_dir = proc_mkdir("bus/nubus", NULL);
-       create_proc_info_entry("devices", 0, proc_bus_nubus_dir,
-                               get_nubus_dev_info);
+       proc_create("devices", 0, proc_bus_nubus_dir, &nubus_devices_proc_fops);
        proc_bus_nubus_add_devices();
 }