mtd: convert to seq_file interface
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 ;
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
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_filein 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_operationsset 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.
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_filein 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_operationsset 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.
Mike Frysinger
Acked-byQuoted 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_filein 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){
structmtd_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_operationsset of funcs for walking the list of mtd devices ...
seq_operationsare 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
Artem Bityutskiy
AppliedQuoted 7 lines · Alexey Dobriyan
->read_proc interface is going away, switch to
seq_file.Signed-off-by Alexey Dobriyan <[email protected]>---
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 (Артём Битюцкий)