Skip to contentSkip to conversation

seq: Convert seq_puts and seq_putc to return void

PATCH In review Joe Perches 5 participants 8 messages Nov 10, 2014 – Nov 12, 2014

Subsystems (10)
Networking Network drivers VFS USB +6 more subsystems
lore
Share & tools
lore
#0 lore raw

cover seq: Convert seq_puts and seq_putc to return void

These are error prone, so return void adn use seq_has_overflowed instead

Joe Perches (2):
seq_puts: Convert to return void and convert uses too.
seq_putc: Convert to return void and convert uses too.

 drivers/char/ipmi/ipmi_msghandler.c                |  4 +-
 drivers/parisc/ccio-dma.c                          |  7 +-
 drivers/regulator/dbx500-prcmu.c                   | 21 ++----
 drivers/usb/gadget/udc/goku_udc.c                  | 81 +++++++++++-----------
 drivers/watchdog/bcm_kona_wdt.c                    | 43 +++++++-----
 fs/seq_file.c                                      | 26 +++----
 include/linux/seq_file.h                           |  4 +-
 ipc/util.c                                         |  6 +-
 .../netfilter/nf_conntrack_l3proto_ipv4_compat.c   |  4 +-
 net/netfilter/nf_conntrack_expect.c                |  4 +-
 10 files changed, 105 insertions(+), 95 deletions(-)
Signature · 1 line
2.1.2
#1 lore raw

PATCH 1/2 seq_puts: Convert to return void and convert uses too.

Using the return value of seq_puts is error-prone, so make it return void instead.

Use seq_has_overflowed where appropriate instead of the old return value.

---
 drivers/parisc/ccio-dma.c         |  7 ++--
 drivers/regulator/dbx500-prcmu.c  | 21 ++++------
 drivers/usb/gadget/udc/goku_udc.c | 81 ++++++++++++++++++++-------------------
 drivers/watchdog/bcm_kona_wdt.c   | 43 ++++++++++++---------
 fs/seq_file.c                     | 15 ++++----
 include/linux/seq_file.h          |  2 +-
 ipc/util.c                        |  6 ++-
 7 files changed, 89 insertions(+), 86 deletions(-)
drivers/parisc/ccio-dma.c +3 -4
index 8b490d7..c40cc98 100644
@@ -1101,7 +1101,6 @@ static const struct file_operations ccio_proc_info_fops = {
 
 static int ccio_proc_bitmap_info(struct seq_file *m, void *p)
 {
-	int len = 0;
 	struct ioc *ioc = ioc_list;
 
 	while (ioc != NULL) {
@@ -1110,11 +1109,11 @@ static int ccio_proc_bitmap_info(struct seq_file *m, void *p)
 
 		for (j = 0; j < (ioc->res_size / sizeof(u32)); j++) {
 			if ((j & 7) == 0)
-				len += seq_puts(m, "\n   ");
-			len += seq_printf(m, "%08x", *res_ptr);
+				seq_puts(m, "\n   ");
+			seq_printf(m, "%08x", *res_ptr);
 			res_ptr++;
 		}
-		len += seq_puts(m, "\n\n");
+		seq_puts(m, "\n\n");
 		ioc = ioc->next;
 		break; /* XXX - remove me */
 	}
drivers/regulator/dbx500-prcmu.c +7 -14
index 2d16b9f..b778ca9 100644
@@ -129,14 +129,8 @@ static int ux500_regulator_status_print(struct seq_file *s, void *p)
 	int i;
 
 	/* print dump header */
-	err = seq_puts(s, "ux500-regulator status:\n");
-	if (err < 0)
-		dev_err(dev, "seq_puts overflow\n");
-
-	err = seq_printf(s, "%31s : %8s : %8s\n", "current",
-		"before", "after");
-	if (err < 0)
-		dev_err(dev, "seq_printf overflow\n");
+	seq_puts(s, "ux500-regulator status:\n");
+	seq_printf(s, "%31s : %8s : %8s\n", "current", "before", "after");
 
 	for (i = 0; i < rdebug.num_regulators; i++) {
 		struct dbx500_regulator_info *info;
@@ -144,12 +138,11 @@ static int ux500_regulator_status_print(struct seq_file *s, void *p)
 		info = &rdebug.regulator_array[i];
 
 		/* print status */
-		err = seq_printf(s, "%20s : %8s : %8s : %8s\n", info->desc.name,
-			info->is_enabled ? "enabled" : "disabled",
-			rdebug.state_before_suspend[i] ? "enabled" : "disabled",
-			rdebug.state_after_suspend[i] ? "enabled" : "disabled");
-		if (err < 0)
-			dev_err(dev, "seq_printf overflow\n");
+		seq_printf(s, "%20s : %8s : %8s : %8s\n",
+			   info->desc.name,
+			   info->is_enabled ? "enabled" : "disabled",
+			   rdebug.state_before_suspend[i] ? "enabled" : "disabled",
+			   rdebug.state_after_suspend[i] ? "enabled" : "disabled");
 	}
 
 	return 0;
drivers/usb/gadget/udc/goku_udc.c +42 -39

96 lines not on this page · raw message

drivers/watchdog/bcm_kona_wdt.c +24 -19

58 lines not on this page · raw message

fs/seq_file.c +8 -7
index 353948b..e6be05a 100644
@@ -683,16 +683,17 @@ int seq_putc(struct seq_file *m, char c)
 }
 EXPORT_SYMBOL(seq_putc);
 
-int seq_puts(struct seq_file *m, const char *s)
+void seq_puts(struct seq_file *m, const char *s)
 {
 	int len = strlen(s);
-	if (m->count + len < m->size) {
-		memcpy(m->buf + m->count, s, len);
-		m->count += len;
-		return 0;
+
+	if (m->count + len >= m->size) {
+		seq_set_overflow(m);
+		return;
 	}
-	seq_set_overflow(m);
-	return -1;
+
+	memcpy(m->buf + m->count, s, len);
+	m->count += len;
 }
 EXPORT_SYMBOL(seq_puts);
 
include/linux/seq_file.h +1 -1
index cf6a9da..9b02cb6 100644
@@ -116,7 +116,7 @@ loff_t seq_lseek(struct file *, loff_t, int);
 int seq_release(struct inode *, struct file *);
 int seq_escape(struct seq_file *, const char *, const char *);
 int seq_putc(struct seq_file *m, char c);
-int seq_puts(struct seq_file *m, const char *s);
+void 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 *, ...);
ipc/util.c +4 -2
index 106bed0..4f726b7 100644
@@ -837,8 +837,10 @@ static int sysvipc_proc_show(struct seq_file *s, void *it)
 	struct ipc_proc_iter *iter = s->private;
 	struct ipc_proc_iface *iface = iter->iface;
 
-	if (it == SEQ_START_TOKEN)
-		return seq_puts(s, iface->header);
+	if (it == SEQ_START_TOKEN) {
+		seq_puts(s, iface->header);
+		return seq_has_overflowed(s);
+	}
 
 	return iface->show(s, it);
 }
Signature · 6 lines
2.1.2

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
maintainer Acked-by on v1 1/2
#2 lore raw

Re: [PATCH -next 1/2] seq_puts: Convert to return void and convert uses too.

Quoted 2 lines · Joe Perches

Using the return value of seq_puts is error-prone, so make it return void instead.

#3 lore raw

Re: [PATCH -next 1/2] seq_puts: Convert to return void and convert uses too.

In reply to Joe Perches

ipc/util.c static int sysvipc_proc_show(struct seq_file *s, void *it) · line 842

Quoted 13 lines · Joe Perches
ipc/util.c +3 -2
index 106bed0..4f726b7 100644
@@ -837,8 +837,10 @@ static int sysvipc_proc_show(struct seq_file *s, void *it)
 	struct ipc_proc_iter *iter = s->private;
 	struct ipc_proc_iface *iface = iter->iface;
 
-	if (it == SEQ_START_TOKEN)
-		return seq_puts(s, iface->header);
+	if (it == SEQ_START_TOKEN) {
+		seq_puts(s, iface->header);
+		return seq_has_overflowed(s);

It should return 0. The overflow is detected by traverse() that is called from seq_read(). If the overflow happens, the size of the buffer is increased and show() is called again.

ipc/util.c static int sysvipc_proc_show(struct seq_file *s, void *it) · line 845

Quoted 3 lines
ipc/util.c +1 -0
+	}
 
 	return iface->show(s, it);

This should stay as is. It seems that the show() function might also return negative value in case of some other failure. See the error handling of "error = m->op->show(m, p);" in traverse() in fs/seq_file.c

The rest of the patch looks fine.

Best Regards,
Petr

#4 lore raw

PATCH 2/2 seq_putc: Convert to return void and convert uses too.

In reply to Joe Perches

Using the return value of seq_putc is error-prone, so make it return void instead.

Reverse the logic in seq_putc to make it like seq_puts.

---
 drivers/char/ipmi/ipmi_msghandler.c                   |  4 +++-
 fs/seq_file.c                                         | 11 ++++++-----
 include/linux/seq_file.h                              |  2 +-
 net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c |  4 +++-
 net/netfilter/nf_conntrack_expect.c                   |  4 +++-
 5 files changed, 16 insertions(+), 9 deletions(-)
drivers/char/ipmi/ipmi_msghandler.c +3 -1
index f816211..c12fb30 100644
@@ -1953,7 +1953,9 @@ static int smi_ipmb_proc_show(struct seq_file *m, void *v)
 	seq_printf(m, "%x", intf->channels[0].address);
 	for (i = 1; i < IPMI_MAX_CHANNELS; i++)
 		seq_printf(m, " %x", intf->channels[i].address);
-	return seq_putc(m, '\n');
+	seq_putc(m, '\n');
+
+	return 0;
 }
 
 static int smi_ipmb_proc_open(struct inode *inode, struct file *file)
fs/seq_file.c +6 -5
index e6be05a..5ca5af9 100644
@@ -673,13 +673,14 @@ int seq_open_private(struct file *filp, const struct seq_operations *ops,
 }
 EXPORT_SYMBOL(seq_open_private);
 
-int seq_putc(struct seq_file *m, char c)
+void seq_putc(struct seq_file *m, char c)
 {
-	if (m->count < m->size) {
-		m->buf[m->count++] = c;
-		return 0;
+	if (m->count >= m->size) {
+		seq_set_overflow(m);
+		return;
 	}
-	return -1;
+
+	m->buf[m->count++] = c;
 }
 EXPORT_SYMBOL(seq_putc);
 
include/linux/seq_file.h +1 -1
index 9b02cb6..c1e47ff 100644
@@ -115,7 +115,7 @@ ssize_t seq_read(struct file *, char __user *, size_t, loff_t *);
 loff_t seq_lseek(struct file *, loff_t, int);
 int seq_release(struct inode *, struct file *);
 int seq_escape(struct seq_file *, const char *, const char *);
-int seq_putc(struct seq_file *m, char c);
+void seq_putc(struct seq_file *m, char c);
 void seq_puts(struct seq_file *m, const char *s);
 int seq_write(struct seq_file *seq, const void *data, size_t len);
 
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c +3 -1
index a460a87..f0dfe92 100644
@@ -300,7 +300,9 @@ static int exp_seq_show(struct seq_file *s, void *v)
 		    __nf_ct_l3proto_find(exp->tuple.src.l3num),
 		    __nf_ct_l4proto_find(exp->tuple.src.l3num,
 					 exp->tuple.dst.protonum));
-	return seq_putc(s, '\n');
+	seq_putc(s, '\n');
+
+	return 0;
 }
 
 static const struct seq_operations exp_seq_ops = {
net/netfilter/nf_conntrack_expect.c +3 -1
index 91a1837..7a17070 100644
@@ -561,7 +561,9 @@ static int exp_seq_show(struct seq_file *s, void *v)
 				   helper->expect_policy[expect->class].name);
 	}
 
-	return seq_putc(s, '\n');
+	seq_putc(s, '\n');
+
+	return 0;
 }
 
 static const struct seq_operations exp_seq_ops = {
Signature · 9 lines
2.1.2


------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications.
Take corrective actions from your mobile device.
http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk
Reviewed-by on v1 2/2
#5 lore raw

Re: [PATCH -next 2/2] seq_putc: Convert to return void and convert uses too.

Quoted 6 lines · Joe Perches

Using the return value of seq_putc is error-prone, so make it return void instead.

Reverse the logic in seq_putc to make it like seq_puts.

The changes are correct. The show() functions should return 0 even when there is an overflow. They are called by traverse() from seq_read() that might increase the buffer size and try again.

Best Regards,
Petr

maintainer Acked-by
#6 lore raw

Re: [PATCH -next 2/2] seq_putc: Convert to return void and convert uses too.

Quoted 6 lines · Petr Mladek
Quoted 5 lines · Joe Perches

Using the return value of seq_putc is error-prone, so make it return void instead.

Reverse the logic in seq_putc to make it like seq_puts.

Quoted 7 lines
Quoted 1 line

The changes are correct. The show() functions should return 0 even when there is an overflow. They are called by traverse() from seq_read() that might increase the buffer size and try again.

Just in case you need this for the netfilter chunks:

Thanks.

Reviewed-by on v1 2/2
#7 lore raw

Re: [PATCH -next 2/2] seq_putc: Convert to return void and convert uses too.

In reply to Joe Perches

Ok by me for the IPMI part.

Quoted 86 lines · Joe Perches

Using the return value of seq_putc is error-prone, so make it return void instead.

Reverse the logic in seq_putc to make it like seq_puts.

---
 drivers/char/ipmi/ipmi_msghandler.c                   |  4 +++-
 fs/seq_file.c                                         | 11 ++++++-----
 include/linux/seq_file.h                              |  2 +-
 net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c |  4 +++-
 net/netfilter/nf_conntrack_expect.c                   |  4 +++-
 5 files changed, 16 insertions(+), 9 deletions(-)
drivers/char/ipmi/ipmi_msghandler.c +3 -1
index f816211..c12fb30 100644
@@ -1953,7 +1953,9 @@ static int smi_ipmb_proc_show(struct seq_file *m, void *v)
 	seq_printf(m, "%x", intf->channels[0].address);
 	for (i = 1; i < IPMI_MAX_CHANNELS; i++)
 		seq_printf(m, " %x", intf->channels[i].address);
-	return seq_putc(m, '\n');
+	seq_putc(m, '\n');
+
+	return 0;
 }
 
 static int smi_ipmb_proc_open(struct inode *inode, struct file *file)
fs/seq_file.c +6 -5
index e6be05a..5ca5af9 100644
@@ -673,13 +673,14 @@ int seq_open_private(struct file *filp, const struct seq_operations *ops,
 }
 EXPORT_SYMBOL(seq_open_private);
 
-int seq_putc(struct seq_file *m, char c)
+void seq_putc(struct seq_file *m, char c)
 {
-	if (m->count < m->size) {
-		m->buf[m->count++] = c;
-		return 0;
+	if (m->count >= m->size) {
+		seq_set_overflow(m);
+		return;
 	}
-	return -1;
+
+	m->buf[m->count++] = c;
 }
 EXPORT_SYMBOL(seq_putc);
 
include/linux/seq_file.h +1 -1
index 9b02cb6..c1e47ff 100644
@@ -115,7 +115,7 @@ ssize_t seq_read(struct file *, char __user *, size_t, loff_t *);
 loff_t seq_lseek(struct file *, loff_t, int);
 int seq_release(struct inode *, struct file *);
 int seq_escape(struct seq_file *, const char *, const char *);
-int seq_putc(struct seq_file *m, char c);
+void seq_putc(struct seq_file *m, char c);
 void seq_puts(struct seq_file *m, const char *s);
 int seq_write(struct seq_file *seq, const void *data, size_t len);
 
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c +3 -1
index a460a87..f0dfe92 100644
@@ -300,7 +300,9 @@ static int exp_seq_show(struct seq_file *s, void *v)
 		    __nf_ct_l3proto_find(exp->tuple.src.l3num),
 		    __nf_ct_l4proto_find(exp->tuple.src.l3num,
 					 exp->tuple.dst.protonum));
-	return seq_putc(s, '\n');
+	seq_putc(s, '\n');
+
+	return 0;
 }
 
 static const struct seq_operations exp_seq_ops = {
net/netfilter/nf_conntrack_expect.c +0 -0
index 91a1837..7a17070 100644

net/netfilter/nf_conntrack_expect.c static int exp_seq_show(struct seq_file *s, void *v) · line 569

Quoted 10 lines
net/netfilter/nf_conntrack_expect.c +3 -1
@@ -561,7 +561,9 @@ static int exp_seq_show(struct seq_file *s, void *v)
 				   helper->expect_policy[expect->class].name);
 	}
 
-	return seq_putc(s, '\n');
+	seq_putc(s, '\n');
+
+	return 0;
 }
 
 static const struct seq_operations exp_seq_ops = {

------------------------------------------------------------------------------
Comprehensive Server Monitoring with Site24x7.
Monitor 10 servers for $9/Month.
Get alerted through email, SMS, voice calls or mobile push notifications. Take corrective actions from your mobile device.
http://pubads.g.doubleclick.net/gampad/clk?id=154624111&iu=/4140/ostg.clktrk