Skip to contentSkip to conversation

mtd: convert to seq_file interface

PATCH Applied Alexey Dobriyan 3 participants 6 messages May 13, 2011 – May 16, 2011 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 mtd: convert to seq_file interface

->read_proc interface is going away, switch to seq_file.

---

 drivers/mtd/mtdcore.c |   50 +++++++++++++++++++-------------------------------
 1 file changed, 19 insertions(+), 31 deletions(-)
drivers/mtd/mtdcore.c +19 -31
@@ -24,6 +24,7 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/ptrace.h>
+#include <linux/seq_file.h>
 #include <linux/string.h>
 #include <linux/timer.h>
 #include <linux/major.h>
@@ -656,44 +657,32 @@ EXPORT_SYMBOL_GPL(default_mtd_writev);
 
 static struct proc_dir_entry *proc_mtd;
 
-static inline int mtd_proc_info(char *buf, struct mtd_info *this)
-{
-	return sprintf(buf, "mtd%d: %8.8llx %8.8x \"%s\"\n", this->index,
-		       (unsigned long long)this->size,
-		       this->erasesize, this->name);
-}
-
-static int mtd_read_proc (char *page, char **start, off_t off, int count,
-			  int *eof, void *data_unused)
+static int mtd_proc_show(struct seq_file *m, void *v)
 {
 	struct mtd_info *mtd;
-	int len, l;
-        off_t   begin = 0;
 
+	seq_puts(m, "dev:    size   erasesize  name\n");
 	mutex_lock(&mtd_table_mutex);
-
-	len = sprintf(page, "dev:    size   erasesize  name\n");
 	mtd_for_each_device(mtd) {
-		l = mtd_proc_info(page + len, mtd);
-                len += l;
-                if (len+begin > off+count)
-                        goto done;
-                if (len+begin < off) {
-                        begin += len;
-                        len = 0;
-                }
+		seq_printf(m, "mtd%d: %8.8llx %8.8x \"%s\"\n",
+			   mtd->index, (unsigned long long)mtd->size,
+			   mtd->erasesize, mtd->name);
         }
-
-        *eof = 1;
-
-done:
 	mutex_unlock(&mtd_table_mutex);
-        if (off >= len+begin)
-                return 0;
-        *start = page + (off-begin);
-        return ((count < begin+len-off) ? count : begin+len-off);
+        return 0;
 }
 
+static int mtd_proc_open(struct inode *inode, struct file *file)
+{
+	return single_open(file, mtd_proc_show, NULL);
+}
+
+static const struct file_operations mtd_proc_ops = {
+	.open		= mtd_proc_open,
+	.read		= seq_read,
+	.llseek		= seq_lseek,
+	.release	= single_release,
+};
 #endif /* CONFIG_PROC_FS */
 
 /*====================================================================*/
@@ -734,8 +723,7 @@ static int __init init_mtd(void)
 		goto err_bdi3;
 
 #ifdef CONFIG_PROC_FS
-	if ((proc_mtd = create_proc_entry( "mtd", 0, NULL )))
-		proc_mtd->read_proc = mtd_read_proc;
+	proc_mtd = proc_create("mtd", 0, NULL, &mtd_proc_ops);
 #endif /* CONFIG_PROC_FS */
 	return 0;
 
#1 lore raw
Quoted 1 line · Alexey Dobriyan

->read_proc interface is going away, switch to seq_file.

while i like converting to seq_file in general, i'm not sure this conversion is correct ... or maybe it's just incomplete ?

Quoted 4 lines
drivers/mtd/mtdcore.c +1 -0
+static int mtd_proc_show(struct seq_file *m, void *v)
 {
       struct mtd_info *mtd;
 

drivers/mtd/mtdcore.c EXPORT_SYMBOL_GPL(default_mtd_writev); · line 673

Quoted 10 lines
drivers/mtd/mtdcore.c +5 -0
+       seq_puts(m, "dev:    size   erasesize  name\n");
       mutex_lock(&mtd_table_mutex);
       mtd_for_each_device(mtd) {
+               seq_printf(m, "mtd%d: %8.8llx %8.8x \"%s\"\n",
+                          mtd->index, (unsigned long long)mtd->size,
+                          mtd->erasesize, mtd->name);
        }
       mutex_unlock(&mtd_table_mutex);
+        return 0;
 }

this is the new version of the func. the old one handled offsets/seeks while the new one doesnt seem to. am i mistaken ?

in particular, it seems like this is missing the seq_operations set of funcs for walking the list of mtd devices ...
-mike

#2 lore raw
Quoted 21 lines · Mike Frysinger
Quoted 1 line · Alexey Dobriyan

->read_proc interface is going away, switch to seq_file.

while i like converting to seq_file in general, i'm not sure this conversion is correct ... or maybe it's just incomplete ?

Quoted 4 lines
drivers/mtd/mtdcore.c +1 -0
+static int mtd_proc_show(struct seq_file *m, void *v)
 {
       struct mtd_info *mtd;
 

drivers/mtd/mtdcore.c EXPORT_SYMBOL_GPL(default_mtd_writev); · line 673

Quoted 10 lines
drivers/mtd/mtdcore.c +5 -0
+       seq_puts(m, "dev:    size   erasesize  name\n");
       mutex_lock(&mtd_table_mutex);
       mtd_for_each_device(mtd) {
+               seq_printf(m, "mtd%d: %8.8llx %8.8x \"%s\"\n",
+                          mtd->index, (unsigned long long)mtd->size,
+                          mtd->erasesize, mtd->name);
        }
       mutex_unlock(&mtd_table_mutex);
+        return 0;
 }
Quoted 2 lines

this is the new version of the func. the old one handled offsets/seeks while the new one doesnt seem to. am i mistaken ?

seq_file does all this for developer, see fs/seq_file.c
All you have to do is to fill buffer with data, this is why it's so cool.

Quoted 2 lines

in particular, it seems like this is missing the seq_operations set of funcs for walking the list of mtd devices ...

Yes and no.
seq_operations aren't mandatory, because it doesn't matter much how exactly buffer is filled. In this case we go for simpler code.

#3 lore raw
In reply to Mike Frysinger
Quoted 21 lines · Mike Frysinger
Quoted 1 line · Alexey Dobriyan

->read_proc interface is going away, switch to seq_file.

while i like converting to seq_file in general, i'm not sure this conversion is correct ... or maybe it's just incomplete ?

Quoted 4 lines
drivers/mtd/mtdcore.c +1 -0
+static int mtd_proc_show(struct seq_file *m, void *v)
 {
       struct mtd_info *mtd;
 

drivers/mtd/mtdcore.c EXPORT_SYMBOL_GPL(default_mtd_writev); · line 673

Quoted 10 lines
drivers/mtd/mtdcore.c +5 -0
+       seq_puts(m, "dev:    size   erasesize  name\n");
       mutex_lock(&mtd_table_mutex);
       mtd_for_each_device(mtd) {
+               seq_printf(m, "mtd%d: %8.8llx %8.8x \"%s\"\n",
+                          mtd->index, (unsigned long long)mtd->size,
+                          mtd->erasesize, mtd->name);
        }
       mutex_unlock(&mtd_table_mutex);
+        return 0;
 }
Quoted 5 lines

this is the new version of the func. the old one handled offsets/seeks while the new one doesnt seem to. am i mistaken ?

in particular, it seems like this is missing the seq_operations set of funcs for walking the list of mtd devices ...

seq_operations are mostly needed when read(2) is going to be short enough to not require walking full object list to fill necessary amount. Seeing that bash reads 32 KB by default, we go for simpler code.

#4 lore raw
Quoted 25 lines · Alexey Dobriyan
Quoted 24 lines · Mike Frysinger
Quoted 1 line · Alexey Dobriyan

->read_proc interface is going away, switch to seq_file.

while i like converting to seq_file in general, i'm not sure this conversion is correct ... or maybe it's just incomplete ?

Quoted 4 lines

+static int mtd_proc_show(struct seq_file *m, void *v) {
       struct mtd_info *mtd;

Quoted 10 lines

+       seq_puts(m, "dev:    size   erasesize  name\n"); mutex_lock(&mtd_table_mutex); mtd_for_each_device(mtd) {
+               seq_printf(m, "mtd%d: %8.8llx %8.8x \"%s\"\n",
+                          mtd->index, (unsigned long long)mtd->size,
+                          mtd->erasesize, mtd->name);
        }
       mutex_unlock(&mtd_table_mutex);
+        return 0;
 }

this is the new version of the func.  the old one handled offsets/seeks while the new one doesnt seem to.  am i mistaken ?

Quoted 6 lines
Quoted 2 lines

in particular, it seems like this is missing the seq_operations set of funcs for walking the list of mtd devices ...

seq_operations are mostly needed when read(2) is going to be short enough to not require walking full object list to fill necessary amount. Seeing that bash reads 32 KB by default, we go for simpler code.

np. thanks for the info. i can probably convert some of my code to simpler seq_file logic ;).

-mike

#5 lore raw
In reply to Alexey Dobriyan
Quoted 7 lines · Alexey Dobriyan

->read_proc interface is going away, switch to seq_file.

---

 drivers/mtd/mtdcore.c |   50 +++++++++++++++++++-------------------------------
 1 file changed, 19 insertions(+), 31 deletions(-)

Pushed to l2-mtd-2.6.git, thanks!

Signature · 2 lines
Best Regards,
Artem Bityutskiy (Артём Битюцкий)