On Thu, 2013-09-12 at 09:06 +0100, David Laight wrote: > > On Wed, Sep 11, 2013 at 05:04:17PM -0700, Joe Perches wrote: > > > On Thu, 2013-09-12 at 08:40 +0900, Tetsuo Handa wrote: > > > > Joe Perches wrote: > > > > > - seq_printf(m, "%s%d%n", con->name, con->index, &len); > > > > > + len = seq_printf(m, "%s%d", con->name, con->index); > > > > > > > > Isn't len always 0 or -1 ? > > > > > > Right. Well you're no fun... [] > > > Suggestions? > > Change the return type of seq_printf() to void and require that > code use access functions/macros to find the length and error > status. Possibly save the length of the last call separately. Are there any races if this is done? --- fs/seq_file.c | 15 +++++++-------- include/linux/seq_file.h | 6 ++++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/fs/seq_file.c b/fs/seq_file.c index 3135c25..b6c9eab 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -389,32 +389,31 @@ int seq_escape(struct seq_file *m, const char *s, const char *esc) } EXPORT_SYMBOL(seq_escape); -int seq_vprintf(struct seq_file *m, const char *f, va_list args) +void seq_vprintf(struct seq_file *m, const char *f, va_list args) { int len; if (m->count < m->size) { len = vsnprintf(m->buf + m->count, m->size - m->count, f, args); + m->last_len = len; if (m->count + len < m->size) { m->count += len; - return 0; + m->last_rtn = 0; + return; } } seq_set_overflow(m); - return -1; + m->last_rtn = -1; } EXPORT_SYMBOL(seq_vprintf); -int seq_printf(struct seq_file *m, const char *f, ...) +void seq_printf(struct seq_file *m, const char *f, ...) { - int ret; va_list args; va_start(args, f); - ret = seq_vprintf(m, f, args); + seq_vprintf(m, f, args); va_end(args); - - return ret; } EXPORT_SYMBOL(seq_printf); diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 4e32edc..9af05e1 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h @@ -20,6 +20,8 @@ struct seq_file { size_t size; size_t from; size_t count; + size_t last_len; + int last_rtn; loff_t index; loff_t read_pos; u64 version; @@ -89,8 +91,8 @@ int seq_putc(struct seq_file *m, char c); int seq_puts(struct seq_file *m, const char *s); int seq_write(struct seq_file *seq, const void *data, size_t len); -__printf(2, 3) int seq_printf(struct seq_file *, const char *, ...); -__printf(2, 0) int seq_vprintf(struct seq_file *, const char *, va_list args); +__printf(2, 3) void seq_printf(struct seq_file *, const char *, ...); +__printf(2, 0) void seq_vprintf(struct seq_file *, const char *, va_list args); int seq_path(struct seq_file *, const struct path *, const char *); int seq_dentry(struct seq_file *, struct dentry *, const char *); _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel