Browse Source

Merge tag 'trace-seq-file-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace into for-next

Pull the beginning of seq_file cleanup from Steven:
  "I'm looking to clean up the seq_file code and to eventually merge the
  trace_seq code with seq_file as well, since they basically do the same thing.

  Part of this process is to remove the return code of seq_printf() and friends
  as they are rather inconsistent. It is better to use the new function
  seq_has_overflowed() if you want to stop processing when the buffer
  is full. Note, if the buffer is full, the seq_file code will throw away
  the contents, allocate a bigger buffer, and then call your code again
  to fill in the data. The only thing that breaking out of the function
  early does is to save a little time which is probably never noticed.

  I started with patches from Joe Perches and modified them as well.
  There's many more places that need to be updated before we can convert
  seq_printf() and friends to return void. But this patch set introduces
  the seq_has_overflowed() and does some initial updates."
Al Viro 10 years ago
parent
commit
8ce74dd605
38 changed files with 410 additions and 437 deletions
  1. 1 1
      Documentation/filesystems/debugfs.txt
  2. 13 9
      Documentation/filesystems/seq_file.txt
  3. 1 1
      Documentation/filesystems/vfs.txt
  4. 2 2
      drivers/net/tun.c
  5. 8 7
      fs/debugfs/file.c
  6. 122 141
      fs/dlm/debug_fs.c
  7. 3 6
      fs/eventfd.c
  8. 5 8
      fs/eventpoll.c
  9. 32 46
      fs/notify/fdinfo.c
  10. 2 2
      fs/notify/fdinfo.h
  11. 2 1
      fs/proc/fd.c
  12. 2 13
      fs/seq_file.c
  13. 1 3
      fs/signalfd.c
  14. 14 13
      fs/timerfd.c
  15. 3 4
      include/linux/debugfs.h
  16. 1 1
      include/linux/fs.h
  17. 15 0
      include/linux/seq_file.h
  18. 1 1
      include/net/netfilter/nf_conntrack_core.h
  19. 2 2
      include/net/netfilter/nf_conntrack_l3proto.h
  20. 3 3
      include/net/netfilter/nf_conntrack_l4proto.h
  21. 3 3
      net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
  22. 28 25
      net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c
  23. 5 5
      net/ipv4/netfilter/nf_conntrack_proto_icmp.c
  24. 3 3
      net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c
  25. 5 5
      net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
  26. 2 3
      net/netfilter/nf_conntrack_l3proto_generic.c
  27. 7 7
      net/netfilter/nf_conntrack_proto_dccp.c
  28. 2 3
      net/netfilter/nf_conntrack_proto_generic.c
  29. 9 9
      net/netfilter/nf_conntrack_proto_gre.c
  30. 7 7
      net/netfilter/nf_conntrack_proto_sctp.c
  31. 7 7
      net/netfilter/nf_conntrack_proto_tcp.c
  32. 5 5
      net/netfilter/nf_conntrack_proto_udp.c
  33. 5 5
      net/netfilter/nf_conntrack_proto_udplite.c
  34. 37 40
      net/netfilter/nf_conntrack_standalone.c
  35. 16 14
      net/netfilter/nf_log.c
  36. 7 6
      net/netfilter/nfnetlink_queue_core.c
  37. 12 7
      net/netfilter/x_tables.c
  38. 17 19
      net/netfilter/xt_hashlimit.c

+ 1 - 1
Documentation/filesystems/debugfs.txt

@@ -140,7 +140,7 @@ file.
 				     struct dentry *parent,
 				     struct dentry *parent,
 				     struct debugfs_regset32 *regset);
 				     struct debugfs_regset32 *regset);
 
 
-    int debugfs_print_regs32(struct seq_file *s, struct debugfs_reg32 *regs,
+    void debugfs_print_regs32(struct seq_file *s, struct debugfs_reg32 *regs,
 			 int nregs, void __iomem *base, char *prefix);
 			 int nregs, void __iomem *base, char *prefix);
 
 
 The "base" argument may be 0, but you may want to build the reg32 array
 The "base" argument may be 0, but you may want to build the reg32 array

+ 13 - 9
Documentation/filesystems/seq_file.txt

@@ -180,23 +180,19 @@ output must be passed to the seq_file code. Some utility functions have
 been defined which make this task easy.
 been defined which make this task easy.
 
 
 Most code will simply use seq_printf(), which works pretty much like
 Most code will simply use seq_printf(), which works pretty much like
-printk(), but which requires the seq_file pointer as an argument. It is
-common to ignore the return value from seq_printf(), but a function
-producing complicated output may want to check that value and quit if
-something non-zero is returned; an error return means that the seq_file
-buffer has been filled and further output will be discarded.
+printk(), but which requires the seq_file pointer as an argument.
 
 
 For straight character output, the following functions may be used:
 For straight character output, the following functions may be used:
 
 
-	int seq_putc(struct seq_file *m, char c);
-	int seq_puts(struct seq_file *m, const char *s);
-	int seq_escape(struct seq_file *m, const char *s, const char *esc);
+	seq_putc(struct seq_file *m, char c);
+	seq_puts(struct seq_file *m, const char *s);
+	seq_escape(struct seq_file *m, const char *s, const char *esc);
 
 
 The first two output a single character and a string, just like one would
 The first two output a single character and a string, just like one would
 expect. seq_escape() is like seq_puts(), except that any character in s
 expect. seq_escape() is like seq_puts(), except that any character in s
 which is in the string esc will be represented in octal form in the output.
 which is in the string esc will be represented in octal form in the output.
 
 
-There is also a pair of functions for printing filenames:
+There are also a pair of functions for printing filenames:
 
 
 	int seq_path(struct seq_file *m, struct path *path, char *esc);
 	int seq_path(struct seq_file *m, struct path *path, char *esc);
 	int seq_path_root(struct seq_file *m, struct path *path,
 	int seq_path_root(struct seq_file *m, struct path *path,
@@ -209,6 +205,14 @@ root is desired, it can be used with seq_path_root().  Note that, if it
 turns out that path cannot be reached from root, the value of root will be
 turns out that path cannot be reached from root, the value of root will be
 changed in seq_file_root() to a root which *does* work.
 changed in seq_file_root() to a root which *does* work.
 
 
+A function producing complicated output may want to check
+	bool seq_has_overflowed(struct seq_file *m);
+and avoid further seq_<output> calls if true is returned.
+
+A true return from seq_has_overflowed means that the seq_file buffer will
+be discarded and the seq_show function will attempt to allocate a larger
+buffer and retry printing.
+
 
 
 Making it all work
 Making it all work
 
 

+ 1 - 1
Documentation/filesystems/vfs.txt

@@ -835,7 +835,7 @@ struct file_operations {
 	ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned int);
 	ssize_t (*splice_read)(struct file *, struct pipe_inode_info *, size_t, unsigned int);
 	int (*setlease)(struct file *, long arg, struct file_lock **, void **);
 	int (*setlease)(struct file *, long arg, struct file_lock **, void **);
 	long (*fallocate)(struct file *, int mode, loff_t offset, loff_t len);
 	long (*fallocate)(struct file *, int mode, loff_t offset, loff_t len);
-	int (*show_fdinfo)(struct seq_file *m, struct file *f);
+	void (*show_fdinfo)(struct seq_file *m, struct file *f);
 };
 };
 
 
 Again, all methods are called without any locks being held, unless
 Again, all methods are called without any locks being held, unless

+ 2 - 2
drivers/net/tun.c

@@ -2209,7 +2209,7 @@ static int tun_chr_close(struct inode *inode, struct file *file)
 }
 }
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
-static int tun_chr_show_fdinfo(struct seq_file *m, struct file *f)
+static void tun_chr_show_fdinfo(struct seq_file *m, struct file *f)
 {
 {
 	struct tun_struct *tun;
 	struct tun_struct *tun;
 	struct ifreq ifr;
 	struct ifreq ifr;
@@ -2225,7 +2225,7 @@ static int tun_chr_show_fdinfo(struct seq_file *m, struct file *f)
 	if (tun)
 	if (tun)
 		tun_put(tun);
 		tun_put(tun);
 
 
-	return seq_printf(m, "iff:\t%s\n", ifr.ifr_name);
+	seq_printf(m, "iff:\t%s\n", ifr.ifr_name);
 }
 }
 #endif
 #endif
 
 

+ 8 - 7
fs/debugfs/file.c

@@ -692,18 +692,19 @@ EXPORT_SYMBOL_GPL(debugfs_create_u32_array);
  * because some peripherals have several blocks of identical registers,
  * because some peripherals have several blocks of identical registers,
  * for example configuration of dma channels
  * for example configuration of dma channels
  */
  */
-int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
-			   int nregs, void __iomem *base, char *prefix)
+void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
+			  int nregs, void __iomem *base, char *prefix)
 {
 {
-	int i, ret = 0;
+	int i;
 
 
 	for (i = 0; i < nregs; i++, regs++) {
 	for (i = 0; i < nregs; i++, regs++) {
 		if (prefix)
 		if (prefix)
-			ret += seq_printf(s, "%s", prefix);
-		ret += seq_printf(s, "%s = 0x%08x\n", regs->name,
-				  readl(base + regs->offset));
+			seq_printf(s, "%s", prefix);
+		seq_printf(s, "%s = 0x%08x\n", regs->name,
+			   readl(base + regs->offset));
+		if (seq_has_overflowed(s))
+			break;
 	}
 	}
-	return ret;
 }
 }
 EXPORT_SYMBOL_GPL(debugfs_print_regs32);
 EXPORT_SYMBOL_GPL(debugfs_print_regs32);
 
 

+ 122 - 141
fs/dlm/debug_fs.c

@@ -48,8 +48,8 @@ static char *print_lockmode(int mode)
 	}
 	}
 }
 }
 
 
-static int print_format1_lock(struct seq_file *s, struct dlm_lkb *lkb,
-			      struct dlm_rsb *res)
+static void print_format1_lock(struct seq_file *s, struct dlm_lkb *lkb,
+			       struct dlm_rsb *res)
 {
 {
 	seq_printf(s, "%08x %s", lkb->lkb_id, print_lockmode(lkb->lkb_grmode));
 	seq_printf(s, "%08x %s", lkb->lkb_id, print_lockmode(lkb->lkb_grmode));
 
 
@@ -68,21 +68,17 @@ static int print_format1_lock(struct seq_file *s, struct dlm_lkb *lkb,
 	if (lkb->lkb_wait_type)
 	if (lkb->lkb_wait_type)
 		seq_printf(s, " wait_type: %d", lkb->lkb_wait_type);
 		seq_printf(s, " wait_type: %d", lkb->lkb_wait_type);
 
 
-	return seq_puts(s, "\n");
+	seq_puts(s, "\n");
 }
 }
 
 
-static int print_format1(struct dlm_rsb *res, struct seq_file *s)
+static void print_format1(struct dlm_rsb *res, struct seq_file *s)
 {
 {
 	struct dlm_lkb *lkb;
 	struct dlm_lkb *lkb;
 	int i, lvblen = res->res_ls->ls_lvblen, recover_list, root_list;
 	int i, lvblen = res->res_ls->ls_lvblen, recover_list, root_list;
-	int rv;
 
 
 	lock_rsb(res);
 	lock_rsb(res);
 
 
-	rv = seq_printf(s, "\nResource %p Name (len=%d) \"",
-			res, res->res_length);
-	if (rv)
-		goto out;
+	seq_printf(s, "\nResource %p Name (len=%d) \"", res, res->res_length);
 
 
 	for (i = 0; i < res->res_length; i++) {
 	for (i = 0; i < res->res_length; i++) {
 		if (isprint(res->res_name[i]))
 		if (isprint(res->res_name[i]))
@@ -92,17 +88,16 @@ static int print_format1(struct dlm_rsb *res, struct seq_file *s)
 	}
 	}
 
 
 	if (res->res_nodeid > 0)
 	if (res->res_nodeid > 0)
-		rv = seq_printf(s, "\"\nLocal Copy, Master is node %d\n",
-				res->res_nodeid);
+		seq_printf(s, "\"\nLocal Copy, Master is node %d\n",
+			   res->res_nodeid);
 	else if (res->res_nodeid == 0)
 	else if (res->res_nodeid == 0)
-		rv = seq_puts(s, "\"\nMaster Copy\n");
+		seq_puts(s, "\"\nMaster Copy\n");
 	else if (res->res_nodeid == -1)
 	else if (res->res_nodeid == -1)
-		rv = seq_printf(s, "\"\nLooking up master (lkid %x)\n",
-			   	res->res_first_lkid);
+		seq_printf(s, "\"\nLooking up master (lkid %x)\n",
+			   res->res_first_lkid);
 	else
 	else
-		rv = seq_printf(s, "\"\nInvalid master %d\n",
-				res->res_nodeid);
-	if (rv)
+		seq_printf(s, "\"\nInvalid master %d\n", res->res_nodeid);
+	if (seq_has_overflowed(s))
 		goto out;
 		goto out;
 
 
 	/* Print the LVB: */
 	/* Print the LVB: */
@@ -116,8 +111,8 @@ static int print_format1(struct dlm_rsb *res, struct seq_file *s)
 		}
 		}
 		if (rsb_flag(res, RSB_VALNOTVALID))
 		if (rsb_flag(res, RSB_VALNOTVALID))
 			seq_puts(s, " (INVALID)");
 			seq_puts(s, " (INVALID)");
-		rv = seq_puts(s, "\n");
-		if (rv)
+		seq_puts(s, "\n");
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
 
 
@@ -125,32 +120,30 @@ static int print_format1(struct dlm_rsb *res, struct seq_file *s)
 	recover_list = !list_empty(&res->res_recover_list);
 	recover_list = !list_empty(&res->res_recover_list);
 
 
 	if (root_list || recover_list) {
 	if (root_list || recover_list) {
-		rv = seq_printf(s, "Recovery: root %d recover %d flags %lx "
-				"count %d\n", root_list, recover_list,
-			   	res->res_flags, res->res_recover_locks_count);
-		if (rv)
-			goto out;
+		seq_printf(s, "Recovery: root %d recover %d flags %lx count %d\n",
+			   root_list, recover_list,
+			   res->res_flags, res->res_recover_locks_count);
 	}
 	}
 
 
 	/* Print the locks attached to this resource */
 	/* Print the locks attached to this resource */
 	seq_puts(s, "Granted Queue\n");
 	seq_puts(s, "Granted Queue\n");
 	list_for_each_entry(lkb, &res->res_grantqueue, lkb_statequeue) {
 	list_for_each_entry(lkb, &res->res_grantqueue, lkb_statequeue) {
-		rv = print_format1_lock(s, lkb, res);
-		if (rv)
+		print_format1_lock(s, lkb, res);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
 
 
 	seq_puts(s, "Conversion Queue\n");
 	seq_puts(s, "Conversion Queue\n");
 	list_for_each_entry(lkb, &res->res_convertqueue, lkb_statequeue) {
 	list_for_each_entry(lkb, &res->res_convertqueue, lkb_statequeue) {
-		rv = print_format1_lock(s, lkb, res);
-		if (rv)
+		print_format1_lock(s, lkb, res);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
 
 
 	seq_puts(s, "Waiting Queue\n");
 	seq_puts(s, "Waiting Queue\n");
 	list_for_each_entry(lkb, &res->res_waitqueue, lkb_statequeue) {
 	list_for_each_entry(lkb, &res->res_waitqueue, lkb_statequeue) {
-		rv = print_format1_lock(s, lkb, res);
-		if (rv)
+		print_format1_lock(s, lkb, res);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
 
 
@@ -159,23 +152,23 @@ static int print_format1(struct dlm_rsb *res, struct seq_file *s)
 
 
 	seq_puts(s, "Lookup Queue\n");
 	seq_puts(s, "Lookup Queue\n");
 	list_for_each_entry(lkb, &res->res_lookup, lkb_rsb_lookup) {
 	list_for_each_entry(lkb, &res->res_lookup, lkb_rsb_lookup) {
-		rv = seq_printf(s, "%08x %s", lkb->lkb_id,
-				print_lockmode(lkb->lkb_rqmode));
+		seq_printf(s, "%08x %s",
+			   lkb->lkb_id, print_lockmode(lkb->lkb_rqmode));
 		if (lkb->lkb_wait_type)
 		if (lkb->lkb_wait_type)
 			seq_printf(s, " wait_type: %d", lkb->lkb_wait_type);
 			seq_printf(s, " wait_type: %d", lkb->lkb_wait_type);
-		rv = seq_puts(s, "\n");
+		seq_puts(s, "\n");
+		if (seq_has_overflowed(s))
+			goto out;
 	}
 	}
  out:
  out:
 	unlock_rsb(res);
 	unlock_rsb(res);
-	return rv;
 }
 }
 
 
-static int print_format2_lock(struct seq_file *s, struct dlm_lkb *lkb,
-			      struct dlm_rsb *r)
+static void print_format2_lock(struct seq_file *s, struct dlm_lkb *lkb,
+			       struct dlm_rsb *r)
 {
 {
 	u64 xid = 0;
 	u64 xid = 0;
 	u64 us;
 	u64 us;
-	int rv;
 
 
 	if (lkb->lkb_flags & DLM_IFL_USER) {
 	if (lkb->lkb_flags & DLM_IFL_USER) {
 		if (lkb->lkb_ua)
 		if (lkb->lkb_ua)
@@ -188,103 +181,97 @@ static int print_format2_lock(struct seq_file *s, struct dlm_lkb *lkb,
 	/* id nodeid remid pid xid exflags flags sts grmode rqmode time_us
 	/* id nodeid remid pid xid exflags flags sts grmode rqmode time_us
 	   r_nodeid r_len r_name */
 	   r_nodeid r_len r_name */
 
 
-	rv = seq_printf(s, "%x %d %x %u %llu %x %x %d %d %d %llu %u %d \"%s\"\n",
-			lkb->lkb_id,
-			lkb->lkb_nodeid,
-			lkb->lkb_remid,
-			lkb->lkb_ownpid,
-			(unsigned long long)xid,
-			lkb->lkb_exflags,
-			lkb->lkb_flags,
-			lkb->lkb_status,
-			lkb->lkb_grmode,
-			lkb->lkb_rqmode,
-			(unsigned long long)us,
-			r->res_nodeid,
-			r->res_length,
-			r->res_name);
-	return rv;
+	seq_printf(s, "%x %d %x %u %llu %x %x %d %d %d %llu %u %d \"%s\"\n",
+		   lkb->lkb_id,
+		   lkb->lkb_nodeid,
+		   lkb->lkb_remid,
+		   lkb->lkb_ownpid,
+		   (unsigned long long)xid,
+		   lkb->lkb_exflags,
+		   lkb->lkb_flags,
+		   lkb->lkb_status,
+		   lkb->lkb_grmode,
+		   lkb->lkb_rqmode,
+		   (unsigned long long)us,
+		   r->res_nodeid,
+		   r->res_length,
+		   r->res_name);
 }
 }
 
 
-static int print_format2(struct dlm_rsb *r, struct seq_file *s)
+static void print_format2(struct dlm_rsb *r, struct seq_file *s)
 {
 {
 	struct dlm_lkb *lkb;
 	struct dlm_lkb *lkb;
-	int rv = 0;
 
 
 	lock_rsb(r);
 	lock_rsb(r);
 
 
 	list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) {
 	list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) {
-		rv = print_format2_lock(s, lkb, r);
-		if (rv)
+		print_format2_lock(s, lkb, r);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
 
 
 	list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) {
 	list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) {
-		rv = print_format2_lock(s, lkb, r);
-		if (rv)
+		print_format2_lock(s, lkb, r);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
 
 
 	list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) {
 	list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) {
-		rv = print_format2_lock(s, lkb, r);
-		if (rv)
+		print_format2_lock(s, lkb, r);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
  out:
  out:
 	unlock_rsb(r);
 	unlock_rsb(r);
-	return rv;
 }
 }
 
 
-static int print_format3_lock(struct seq_file *s, struct dlm_lkb *lkb,
+static void print_format3_lock(struct seq_file *s, struct dlm_lkb *lkb,
 			      int rsb_lookup)
 			      int rsb_lookup)
 {
 {
 	u64 xid = 0;
 	u64 xid = 0;
-	int rv;
 
 
 	if (lkb->lkb_flags & DLM_IFL_USER) {
 	if (lkb->lkb_flags & DLM_IFL_USER) {
 		if (lkb->lkb_ua)
 		if (lkb->lkb_ua)
 			xid = lkb->lkb_ua->xid;
 			xid = lkb->lkb_ua->xid;
 	}
 	}
 
 
-	rv = seq_printf(s, "lkb %x %d %x %u %llu %x %x %d %d %d %d %d %d %u %llu %llu\n",
-			lkb->lkb_id,
-			lkb->lkb_nodeid,
-			lkb->lkb_remid,
-			lkb->lkb_ownpid,
-			(unsigned long long)xid,
-			lkb->lkb_exflags,
-			lkb->lkb_flags,
-			lkb->lkb_status,
-			lkb->lkb_grmode,
-			lkb->lkb_rqmode,
-			lkb->lkb_last_bast.mode,
-			rsb_lookup,
-			lkb->lkb_wait_type,
-			lkb->lkb_lvbseq,
-			(unsigned long long)ktime_to_ns(lkb->lkb_timestamp),
-			(unsigned long long)ktime_to_ns(lkb->lkb_last_bast_time));
-	return rv;
+	seq_printf(s, "lkb %x %d %x %u %llu %x %x %d %d %d %d %d %d %u %llu %llu\n",
+		   lkb->lkb_id,
+		   lkb->lkb_nodeid,
+		   lkb->lkb_remid,
+		   lkb->lkb_ownpid,
+		   (unsigned long long)xid,
+		   lkb->lkb_exflags,
+		   lkb->lkb_flags,
+		   lkb->lkb_status,
+		   lkb->lkb_grmode,
+		   lkb->lkb_rqmode,
+		   lkb->lkb_last_bast.mode,
+		   rsb_lookup,
+		   lkb->lkb_wait_type,
+		   lkb->lkb_lvbseq,
+		   (unsigned long long)ktime_to_ns(lkb->lkb_timestamp),
+		   (unsigned long long)ktime_to_ns(lkb->lkb_last_bast_time));
 }
 }
 
 
-static int print_format3(struct dlm_rsb *r, struct seq_file *s)
+static void print_format3(struct dlm_rsb *r, struct seq_file *s)
 {
 {
 	struct dlm_lkb *lkb;
 	struct dlm_lkb *lkb;
 	int i, lvblen = r->res_ls->ls_lvblen;
 	int i, lvblen = r->res_ls->ls_lvblen;
 	int print_name = 1;
 	int print_name = 1;
-	int rv;
 
 
 	lock_rsb(r);
 	lock_rsb(r);
 
 
-	rv = seq_printf(s, "rsb %p %d %x %lx %d %d %u %d ",
-			r,
-			r->res_nodeid,
-			r->res_first_lkid,
-			r->res_flags,
-			!list_empty(&r->res_root_list),
-			!list_empty(&r->res_recover_list),
-			r->res_recover_locks_count,
-			r->res_length);
-	if (rv)
+	seq_printf(s, "rsb %p %d %x %lx %d %d %u %d ",
+		   r,
+		   r->res_nodeid,
+		   r->res_first_lkid,
+		   r->res_flags,
+		   !list_empty(&r->res_root_list),
+		   !list_empty(&r->res_recover_list),
+		   r->res_recover_locks_count,
+		   r->res_length);
+	if (seq_has_overflowed(s))
 		goto out;
 		goto out;
 
 
 	for (i = 0; i < r->res_length; i++) {
 	for (i = 0; i < r->res_length; i++) {
@@ -292,7 +279,7 @@ static int print_format3(struct dlm_rsb *r, struct seq_file *s)
 			print_name = 0;
 			print_name = 0;
 	}
 	}
 
 
-	seq_printf(s, "%s", print_name ? "str " : "hex");
+	seq_puts(s, print_name ? "str " : "hex");
 
 
 	for (i = 0; i < r->res_length; i++) {
 	for (i = 0; i < r->res_length; i++) {
 		if (print_name)
 		if (print_name)
@@ -300,8 +287,8 @@ static int print_format3(struct dlm_rsb *r, struct seq_file *s)
 		else
 		else
 			seq_printf(s, " %02x", (unsigned char)r->res_name[i]);
 			seq_printf(s, " %02x", (unsigned char)r->res_name[i]);
 	}
 	}
-	rv = seq_puts(s, "\n");
-	if (rv)
+	seq_puts(s, "\n");
+	if (seq_has_overflowed(s))
 		goto out;
 		goto out;
 
 
 	if (!r->res_lvbptr)
 	if (!r->res_lvbptr)
@@ -311,65 +298,62 @@ static int print_format3(struct dlm_rsb *r, struct seq_file *s)
 
 
 	for (i = 0; i < lvblen; i++)
 	for (i = 0; i < lvblen; i++)
 		seq_printf(s, " %02x", (unsigned char)r->res_lvbptr[i]);
 		seq_printf(s, " %02x", (unsigned char)r->res_lvbptr[i]);
-	rv = seq_puts(s, "\n");
-	if (rv)
+	seq_puts(s, "\n");
+	if (seq_has_overflowed(s))
 		goto out;
 		goto out;
 
 
  do_locks:
  do_locks:
 	list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) {
 	list_for_each_entry(lkb, &r->res_grantqueue, lkb_statequeue) {
-		rv = print_format3_lock(s, lkb, 0);
-		if (rv)
+		print_format3_lock(s, lkb, 0);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
 
 
 	list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) {
 	list_for_each_entry(lkb, &r->res_convertqueue, lkb_statequeue) {
-		rv = print_format3_lock(s, lkb, 0);
-		if (rv)
+		print_format3_lock(s, lkb, 0);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
 
 
 	list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) {
 	list_for_each_entry(lkb, &r->res_waitqueue, lkb_statequeue) {
-		rv = print_format3_lock(s, lkb, 0);
-		if (rv)
+		print_format3_lock(s, lkb, 0);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
 
 
 	list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup) {
 	list_for_each_entry(lkb, &r->res_lookup, lkb_rsb_lookup) {
-		rv = print_format3_lock(s, lkb, 1);
-		if (rv)
+		print_format3_lock(s, lkb, 1);
+		if (seq_has_overflowed(s))
 			goto out;
 			goto out;
 	}
 	}
  out:
  out:
 	unlock_rsb(r);
 	unlock_rsb(r);
-	return rv;
 }
 }
 
 
-static int print_format4(struct dlm_rsb *r, struct seq_file *s)
+static void print_format4(struct dlm_rsb *r, struct seq_file *s)
 {
 {
 	int our_nodeid = dlm_our_nodeid();
 	int our_nodeid = dlm_our_nodeid();
 	int print_name = 1;
 	int print_name = 1;
-	int i, rv;
+	int i;
 
 
 	lock_rsb(r);
 	lock_rsb(r);
 
 
-	rv = seq_printf(s, "rsb %p %d %d %d %d %lu %lx %d ",
-			r,
-			r->res_nodeid,
-			r->res_master_nodeid,
-			r->res_dir_nodeid,
-			our_nodeid,
-			r->res_toss_time,
-			r->res_flags,
-			r->res_length);
-	if (rv)
-		goto out;
+	seq_printf(s, "rsb %p %d %d %d %d %lu %lx %d ",
+		   r,
+		   r->res_nodeid,
+		   r->res_master_nodeid,
+		   r->res_dir_nodeid,
+		   our_nodeid,
+		   r->res_toss_time,
+		   r->res_flags,
+		   r->res_length);
 
 
 	for (i = 0; i < r->res_length; i++) {
 	for (i = 0; i < r->res_length; i++) {
 		if (!isascii(r->res_name[i]) || !isprint(r->res_name[i]))
 		if (!isascii(r->res_name[i]) || !isprint(r->res_name[i]))
 			print_name = 0;
 			print_name = 0;
 	}
 	}
 
 
-	seq_printf(s, "%s", print_name ? "str " : "hex");
+	seq_puts(s, print_name ? "str " : "hex");
 
 
 	for (i = 0; i < r->res_length; i++) {
 	for (i = 0; i < r->res_length; i++) {
 		if (print_name)
 		if (print_name)
@@ -377,10 +361,9 @@ static int print_format4(struct dlm_rsb *r, struct seq_file *s)
 		else
 		else
 			seq_printf(s, " %02x", (unsigned char)r->res_name[i]);
 			seq_printf(s, " %02x", (unsigned char)r->res_name[i]);
 	}
 	}
-	rv = seq_puts(s, "\n");
- out:
+	seq_puts(s, "\n");
+
 	unlock_rsb(r);
 	unlock_rsb(r);
-	return rv;
 }
 }
 
 
 struct rsbtbl_iter {
 struct rsbtbl_iter {
@@ -390,47 +373,45 @@ struct rsbtbl_iter {
 	int header;
 	int header;
 };
 };
 
 
-/* seq_printf returns -1 if the buffer is full, and 0 otherwise.
-   If the buffer is full, seq_printf can be called again, but it
-   does nothing and just returns -1.  So, the these printing routines
-   periodically check the return value to avoid wasting too much time
-   trying to print to a full buffer. */
+/*
+ * If the buffer is full, seq_printf can be called again, but it
+ * does nothing.  So, the these printing routines periodically check
+ * seq_has_overflowed to avoid wasting too much time trying to print to
+ * a full buffer.
+ */
 
 
 static int table_seq_show(struct seq_file *seq, void *iter_ptr)
 static int table_seq_show(struct seq_file *seq, void *iter_ptr)
 {
 {
 	struct rsbtbl_iter *ri = iter_ptr;
 	struct rsbtbl_iter *ri = iter_ptr;
-	int rv = 0;
 
 
 	switch (ri->format) {
 	switch (ri->format) {
 	case 1:
 	case 1:
-		rv = print_format1(ri->rsb, seq);
+		print_format1(ri->rsb, seq);
 		break;
 		break;
 	case 2:
 	case 2:
 		if (ri->header) {
 		if (ri->header) {
-			seq_printf(seq, "id nodeid remid pid xid exflags "
-					"flags sts grmode rqmode time_ms "
-					"r_nodeid r_len r_name\n");
+			seq_puts(seq, "id nodeid remid pid xid exflags flags sts grmode rqmode time_ms r_nodeid r_len r_name\n");
 			ri->header = 0;
 			ri->header = 0;
 		}
 		}
-		rv = print_format2(ri->rsb, seq);
+		print_format2(ri->rsb, seq);
 		break;
 		break;
 	case 3:
 	case 3:
 		if (ri->header) {
 		if (ri->header) {
-			seq_printf(seq, "version rsb 1.1 lvb 1.1 lkb 1.1\n");
+			seq_puts(seq, "version rsb 1.1 lvb 1.1 lkb 1.1\n");
 			ri->header = 0;
 			ri->header = 0;
 		}
 		}
-		rv = print_format3(ri->rsb, seq);
+		print_format3(ri->rsb, seq);
 		break;
 		break;
 	case 4:
 	case 4:
 		if (ri->header) {
 		if (ri->header) {
-			seq_printf(seq, "version 4 rsb 2\n");
+			seq_puts(seq, "version 4 rsb 2\n");
 			ri->header = 0;
 			ri->header = 0;
 		}
 		}
-		rv = print_format4(ri->rsb, seq);
+		print_format4(ri->rsb, seq);
 		break;
 		break;
 	}
 	}
 
 
-	return rv;
+	return 0;
 }
 }
 
 
 static const struct seq_operations format1_seq_ops;
 static const struct seq_operations format1_seq_ops;

+ 3 - 6
fs/eventfd.c

@@ -287,17 +287,14 @@ static ssize_t eventfd_write(struct file *file, const char __user *buf, size_t c
 }
 }
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
-static int eventfd_show_fdinfo(struct seq_file *m, struct file *f)
+static void eventfd_show_fdinfo(struct seq_file *m, struct file *f)
 {
 {
 	struct eventfd_ctx *ctx = f->private_data;
 	struct eventfd_ctx *ctx = f->private_data;
-	int ret;
 
 
 	spin_lock_irq(&ctx->wqh.lock);
 	spin_lock_irq(&ctx->wqh.lock);
-	ret = seq_printf(m, "eventfd-count: %16llx\n",
-			 (unsigned long long)ctx->count);
+	seq_printf(m, "eventfd-count: %16llx\n",
+		   (unsigned long long)ctx->count);
 	spin_unlock_irq(&ctx->wqh.lock);
 	spin_unlock_irq(&ctx->wqh.lock);
-
-	return ret;
 }
 }
 #endif
 #endif
 
 

+ 5 - 8
fs/eventpoll.c

@@ -870,25 +870,22 @@ static unsigned int ep_eventpoll_poll(struct file *file, poll_table *wait)
 }
 }
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
-static int ep_show_fdinfo(struct seq_file *m, struct file *f)
+static void ep_show_fdinfo(struct seq_file *m, struct file *f)
 {
 {
 	struct eventpoll *ep = f->private_data;
 	struct eventpoll *ep = f->private_data;
 	struct rb_node *rbp;
 	struct rb_node *rbp;
-	int ret = 0;
 
 
 	mutex_lock(&ep->mtx);
 	mutex_lock(&ep->mtx);
 	for (rbp = rb_first(&ep->rbr); rbp; rbp = rb_next(rbp)) {
 	for (rbp = rb_first(&ep->rbr); rbp; rbp = rb_next(rbp)) {
 		struct epitem *epi = rb_entry(rbp, struct epitem, rbn);
 		struct epitem *epi = rb_entry(rbp, struct epitem, rbn);
 
 
-		ret = seq_printf(m, "tfd: %8d events: %8x data: %16llx\n",
-				 epi->ffd.fd, epi->event.events,
-				 (long long)epi->event.data);
-		if (ret)
+		seq_printf(m, "tfd: %8d events: %8x data: %16llx\n",
+			   epi->ffd.fd, epi->event.events,
+			   (long long)epi->event.data);
+		if (seq_has_overflowed(m))
 			break;
 			break;
 	}
 	}
 	mutex_unlock(&ep->mtx);
 	mutex_unlock(&ep->mtx);
-
-	return ret;
 }
 }
 #endif
 #endif
 
 

+ 32 - 46
fs/notify/fdinfo.c

@@ -20,25 +20,24 @@
 
 
 #if defined(CONFIG_INOTIFY_USER) || defined(CONFIG_FANOTIFY)
 #if defined(CONFIG_INOTIFY_USER) || defined(CONFIG_FANOTIFY)
 
 
-static int show_fdinfo(struct seq_file *m, struct file *f,
-		       int (*show)(struct seq_file *m, struct fsnotify_mark *mark))
+static void show_fdinfo(struct seq_file *m, struct file *f,
+			void (*show)(struct seq_file *m,
+				     struct fsnotify_mark *mark))
 {
 {
 	struct fsnotify_group *group = f->private_data;
 	struct fsnotify_group *group = f->private_data;
 	struct fsnotify_mark *mark;
 	struct fsnotify_mark *mark;
-	int ret = 0;
 
 
 	mutex_lock(&group->mark_mutex);
 	mutex_lock(&group->mark_mutex);
 	list_for_each_entry(mark, &group->marks_list, g_list) {
 	list_for_each_entry(mark, &group->marks_list, g_list) {
-		ret = show(m, mark);
-		if (ret)
+		show(m, mark);
+		if (seq_has_overflowed(m))
 			break;
 			break;
 	}
 	}
 	mutex_unlock(&group->mark_mutex);
 	mutex_unlock(&group->mark_mutex);
-	return ret;
 }
 }
 
 
 #if defined(CONFIG_EXPORTFS)
 #if defined(CONFIG_EXPORTFS)
-static int show_mark_fhandle(struct seq_file *m, struct inode *inode)
+static void show_mark_fhandle(struct seq_file *m, struct inode *inode)
 {
 {
 	struct {
 	struct {
 		struct file_handle handle;
 		struct file_handle handle;
@@ -52,71 +51,62 @@ static int show_mark_fhandle(struct seq_file *m, struct inode *inode)
 	ret = exportfs_encode_inode_fh(inode, (struct fid *)f.handle.f_handle, &size, 0);
 	ret = exportfs_encode_inode_fh(inode, (struct fid *)f.handle.f_handle, &size, 0);
 	if ((ret == FILEID_INVALID) || (ret < 0)) {
 	if ((ret == FILEID_INVALID) || (ret < 0)) {
 		WARN_ONCE(1, "Can't encode file handler for inotify: %d\n", ret);
 		WARN_ONCE(1, "Can't encode file handler for inotify: %d\n", ret);
-		return 0;
+		return;
 	}
 	}
 
 
 	f.handle.handle_type = ret;
 	f.handle.handle_type = ret;
 	f.handle.handle_bytes = size * sizeof(u32);
 	f.handle.handle_bytes = size * sizeof(u32);
 
 
-	ret = seq_printf(m, "fhandle-bytes:%x fhandle-type:%x f_handle:",
-			 f.handle.handle_bytes, f.handle.handle_type);
+	seq_printf(m, "fhandle-bytes:%x fhandle-type:%x f_handle:",
+		   f.handle.handle_bytes, f.handle.handle_type);
 
 
 	for (i = 0; i < f.handle.handle_bytes; i++)
 	for (i = 0; i < f.handle.handle_bytes; i++)
-		ret |= seq_printf(m, "%02x", (int)f.handle.f_handle[i]);
-
-	return ret;
+		seq_printf(m, "%02x", (int)f.handle.f_handle[i]);
 }
 }
 #else
 #else
-static int show_mark_fhandle(struct seq_file *m, struct inode *inode)
+static void show_mark_fhandle(struct seq_file *m, struct inode *inode)
 {
 {
-	return 0;
 }
 }
 #endif
 #endif
 
 
 #ifdef CONFIG_INOTIFY_USER
 #ifdef CONFIG_INOTIFY_USER
 
 
-static int inotify_fdinfo(struct seq_file *m, struct fsnotify_mark *mark)
+static void inotify_fdinfo(struct seq_file *m, struct fsnotify_mark *mark)
 {
 {
 	struct inotify_inode_mark *inode_mark;
 	struct inotify_inode_mark *inode_mark;
 	struct inode *inode;
 	struct inode *inode;
-	int ret = 0;
 
 
 	if (!(mark->flags & (FSNOTIFY_MARK_FLAG_ALIVE | FSNOTIFY_MARK_FLAG_INODE)))
 	if (!(mark->flags & (FSNOTIFY_MARK_FLAG_ALIVE | FSNOTIFY_MARK_FLAG_INODE)))
-		return 0;
+		return;
 
 
 	inode_mark = container_of(mark, struct inotify_inode_mark, fsn_mark);
 	inode_mark = container_of(mark, struct inotify_inode_mark, fsn_mark);
 	inode = igrab(mark->i.inode);
 	inode = igrab(mark->i.inode);
 	if (inode) {
 	if (inode) {
-		ret = seq_printf(m, "inotify wd:%x ino:%lx sdev:%x "
-				 "mask:%x ignored_mask:%x ",
-				 inode_mark->wd, inode->i_ino,
-				 inode->i_sb->s_dev,
-				 mark->mask, mark->ignored_mask);
-		ret |= show_mark_fhandle(m, inode);
-		ret |= seq_putc(m, '\n');
+		seq_printf(m, "inotify wd:%x ino:%lx sdev:%x mask:%x ignored_mask:%x ",
+			   inode_mark->wd, inode->i_ino, inode->i_sb->s_dev,
+			   mark->mask, mark->ignored_mask);
+		show_mark_fhandle(m, inode);
+		seq_putc(m, '\n');
 		iput(inode);
 		iput(inode);
 	}
 	}
-
-	return ret;
 }
 }
 
 
-int inotify_show_fdinfo(struct seq_file *m, struct file *f)
+void inotify_show_fdinfo(struct seq_file *m, struct file *f)
 {
 {
-	return show_fdinfo(m, f, inotify_fdinfo);
+	show_fdinfo(m, f, inotify_fdinfo);
 }
 }
 
 
 #endif /* CONFIG_INOTIFY_USER */
 #endif /* CONFIG_INOTIFY_USER */
 
 
 #ifdef CONFIG_FANOTIFY
 #ifdef CONFIG_FANOTIFY
 
 
-static int fanotify_fdinfo(struct seq_file *m, struct fsnotify_mark *mark)
+static void fanotify_fdinfo(struct seq_file *m, struct fsnotify_mark *mark)
 {
 {
 	unsigned int mflags = 0;
 	unsigned int mflags = 0;
 	struct inode *inode;
 	struct inode *inode;
-	int ret = 0;
 
 
 	if (!(mark->flags & FSNOTIFY_MARK_FLAG_ALIVE))
 	if (!(mark->flags & FSNOTIFY_MARK_FLAG_ALIVE))
-		return 0;
+		return;
 
 
 	if (mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY)
 	if (mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY)
 		mflags |= FAN_MARK_IGNORED_SURV_MODIFY;
 		mflags |= FAN_MARK_IGNORED_SURV_MODIFY;
@@ -124,26 +114,22 @@ static int fanotify_fdinfo(struct seq_file *m, struct fsnotify_mark *mark)
 	if (mark->flags & FSNOTIFY_MARK_FLAG_INODE) {
 	if (mark->flags & FSNOTIFY_MARK_FLAG_INODE) {
 		inode = igrab(mark->i.inode);
 		inode = igrab(mark->i.inode);
 		if (!inode)
 		if (!inode)
-			goto out;
-		ret = seq_printf(m, "fanotify ino:%lx sdev:%x "
-				 "mflags:%x mask:%x ignored_mask:%x ",
-				 inode->i_ino, inode->i_sb->s_dev,
-				 mflags, mark->mask, mark->ignored_mask);
-		ret |= show_mark_fhandle(m, inode);
-		ret |= seq_putc(m, '\n');
+			return;
+		seq_printf(m, "fanotify ino:%lx sdev:%x mflags:%x mask:%x ignored_mask:%x ",
+			   inode->i_ino, inode->i_sb->s_dev,
+			   mflags, mark->mask, mark->ignored_mask);
+		show_mark_fhandle(m, inode);
+		seq_putc(m, '\n');
 		iput(inode);
 		iput(inode);
 	} else if (mark->flags & FSNOTIFY_MARK_FLAG_VFSMOUNT) {
 	} else if (mark->flags & FSNOTIFY_MARK_FLAG_VFSMOUNT) {
 		struct mount *mnt = real_mount(mark->m.mnt);
 		struct mount *mnt = real_mount(mark->m.mnt);
 
 
-		ret = seq_printf(m, "fanotify mnt_id:%x mflags:%x mask:%x "
-				 "ignored_mask:%x\n", mnt->mnt_id, mflags,
-				 mark->mask, mark->ignored_mask);
+		seq_printf(m, "fanotify mnt_id:%x mflags:%x mask:%x ignored_mask:%x\n",
+			   mnt->mnt_id, mflags, mark->mask, mark->ignored_mask);
 	}
 	}
-out:
-	return ret;
 }
 }
 
 
-int fanotify_show_fdinfo(struct seq_file *m, struct file *f)
+void fanotify_show_fdinfo(struct seq_file *m, struct file *f)
 {
 {
 	struct fsnotify_group *group = f->private_data;
 	struct fsnotify_group *group = f->private_data;
 	unsigned int flags = 0;
 	unsigned int flags = 0;
@@ -169,7 +155,7 @@ int fanotify_show_fdinfo(struct seq_file *m, struct file *f)
 	seq_printf(m, "fanotify flags:%x event-flags:%x\n",
 	seq_printf(m, "fanotify flags:%x event-flags:%x\n",
 		   flags, group->fanotify_data.f_flags);
 		   flags, group->fanotify_data.f_flags);
 
 
-	return show_fdinfo(m, f, fanotify_fdinfo);
+	show_fdinfo(m, f, fanotify_fdinfo);
 }
 }
 
 
 #endif /* CONFIG_FANOTIFY */
 #endif /* CONFIG_FANOTIFY */

+ 2 - 2
fs/notify/fdinfo.h

@@ -10,11 +10,11 @@ struct file;
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
 
 
 #ifdef CONFIG_INOTIFY_USER
 #ifdef CONFIG_INOTIFY_USER
-extern int inotify_show_fdinfo(struct seq_file *m, struct file *f);
+void inotify_show_fdinfo(struct seq_file *m, struct file *f);
 #endif
 #endif
 
 
 #ifdef CONFIG_FANOTIFY
 #ifdef CONFIG_FANOTIFY
-extern int fanotify_show_fdinfo(struct seq_file *m, struct file *f);
+void fanotify_show_fdinfo(struct seq_file *m, struct file *f);
 #endif
 #endif
 
 
 #else /* CONFIG_PROC_FS */
 #else /* CONFIG_PROC_FS */

+ 2 - 1
fs/proc/fd.c

@@ -53,7 +53,8 @@ static int seq_show(struct seq_file *m, void *v)
 			   (long long)file->f_pos, f_flags,
 			   (long long)file->f_pos, f_flags,
 			   real_mount(file->f_path.mnt)->mnt_id);
 			   real_mount(file->f_path.mnt)->mnt_id);
 		if (file->f_op->show_fdinfo)
 		if (file->f_op->show_fdinfo)
-			ret = file->f_op->show_fdinfo(m, file);
+			file->f_op->show_fdinfo(m, file);
+		ret = seq_has_overflowed(m);
 		fput(file);
 		fput(file);
 	}
 	}
 
 

+ 2 - 13
fs/seq_file.c

@@ -16,17 +16,6 @@
 #include <asm/uaccess.h>
 #include <asm/uaccess.h>
 #include <asm/page.h>
 #include <asm/page.h>
 
 
-
-/*
- * seq_files have a buffer which can may overflow. When this happens a larger
- * buffer is reallocated and all the data will be printed again.
- * The overflow state is true when m->count == m->size.
- */
-static bool seq_overflow(struct seq_file *m)
-{
-	return m->count == m->size;
-}
-
 static void seq_set_overflow(struct seq_file *m)
 static void seq_set_overflow(struct seq_file *m)
 {
 {
 	m->count = m->size;
 	m->count = m->size;
@@ -124,7 +113,7 @@ static int traverse(struct seq_file *m, loff_t offset)
 			error = 0;
 			error = 0;
 			m->count = 0;
 			m->count = 0;
 		}
 		}
-		if (seq_overflow(m))
+		if (seq_has_overflowed(m))
 			goto Eoverflow;
 			goto Eoverflow;
 		if (pos + m->count > offset) {
 		if (pos + m->count > offset) {
 			m->from = offset - pos;
 			m->from = offset - pos;
@@ -267,7 +256,7 @@ Fill:
 			break;
 			break;
 		}
 		}
 		err = m->op->show(m, p);
 		err = m->op->show(m, p);
-		if (seq_overflow(m) || err) {
+		if (seq_has_overflowed(m) || err) {
 			m->count = offs;
 			m->count = offs;
 			if (likely(err <= 0))
 			if (likely(err <= 0))
 				break;
 				break;

+ 1 - 3
fs/signalfd.c

@@ -230,7 +230,7 @@ static ssize_t signalfd_read(struct file *file, char __user *buf, size_t count,
 }
 }
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
-static int signalfd_show_fdinfo(struct seq_file *m, struct file *f)
+static void signalfd_show_fdinfo(struct seq_file *m, struct file *f)
 {
 {
 	struct signalfd_ctx *ctx = f->private_data;
 	struct signalfd_ctx *ctx = f->private_data;
 	sigset_t sigmask;
 	sigset_t sigmask;
@@ -238,8 +238,6 @@ static int signalfd_show_fdinfo(struct seq_file *m, struct file *f)
 	sigmask = ctx->sigmask;
 	sigmask = ctx->sigmask;
 	signotset(&sigmask);
 	signotset(&sigmask);
 	render_sigset_t(m, "sigmask:\t", &sigmask);
 	render_sigset_t(m, "sigmask:\t", &sigmask);
-
-	return 0;
 }
 }
 #endif
 #endif
 
 

+ 14 - 13
fs/timerfd.c

@@ -288,7 +288,7 @@ static ssize_t timerfd_read(struct file *file, char __user *buf, size_t count,
 }
 }
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
-static int timerfd_show(struct seq_file *m, struct file *file)
+static void timerfd_show(struct seq_file *m, struct file *file)
 {
 {
 	struct timerfd_ctx *ctx = file->private_data;
 	struct timerfd_ctx *ctx = file->private_data;
 	struct itimerspec t;
 	struct itimerspec t;
@@ -298,18 +298,19 @@ static int timerfd_show(struct seq_file *m, struct file *file)
 	t.it_interval = ktime_to_timespec(ctx->tintv);
 	t.it_interval = ktime_to_timespec(ctx->tintv);
 	spin_unlock_irq(&ctx->wqh.lock);
 	spin_unlock_irq(&ctx->wqh.lock);
 
 
-	return seq_printf(m,
-			  "clockid: %d\n"
-			  "ticks: %llu\n"
-			  "settime flags: 0%o\n"
-			  "it_value: (%llu, %llu)\n"
-			  "it_interval: (%llu, %llu)\n",
-			  ctx->clockid, (unsigned long long)ctx->ticks,
-			  ctx->settime_flags,
-			  (unsigned long long)t.it_value.tv_sec,
-			  (unsigned long long)t.it_value.tv_nsec,
-			  (unsigned long long)t.it_interval.tv_sec,
-			  (unsigned long long)t.it_interval.tv_nsec);
+	seq_printf(m,
+		   "clockid: %d\n"
+		   "ticks: %llu\n"
+		   "settime flags: 0%o\n"
+		   "it_value: (%llu, %llu)\n"
+		   "it_interval: (%llu, %llu)\n",
+		   ctx->clockid,
+		   (unsigned long long)ctx->ticks,
+		   ctx->settime_flags,
+		   (unsigned long long)t.it_value.tv_sec,
+		   (unsigned long long)t.it_value.tv_nsec,
+		   (unsigned long long)t.it_interval.tv_sec,
+		   (unsigned long long)t.it_interval.tv_nsec);
 }
 }
 #else
 #else
 #define timerfd_show NULL
 #define timerfd_show NULL

+ 3 - 4
include/linux/debugfs.h

@@ -92,8 +92,8 @@ struct dentry *debugfs_create_regset32(const char *name, umode_t mode,
 				     struct dentry *parent,
 				     struct dentry *parent,
 				     struct debugfs_regset32 *regset);
 				     struct debugfs_regset32 *regset);
 
 
-int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
-			 int nregs, void __iomem *base, char *prefix);
+void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
+			  int nregs, void __iomem *base, char *prefix);
 
 
 struct dentry *debugfs_create_u32_array(const char *name, umode_t mode,
 struct dentry *debugfs_create_u32_array(const char *name, umode_t mode,
 					struct dentry *parent,
 					struct dentry *parent,
@@ -233,10 +233,9 @@ static inline struct dentry *debugfs_create_regset32(const char *name,
 	return ERR_PTR(-ENODEV);
 	return ERR_PTR(-ENODEV);
 }
 }
 
 
-static inline int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
+static inline void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
 			 int nregs, void __iomem *base, char *prefix)
 			 int nregs, void __iomem *base, char *prefix)
 {
 {
-	return 0;
 }
 }
 
 
 static inline bool debugfs_initialized(void)
 static inline bool debugfs_initialized(void)

+ 1 - 1
include/linux/fs.h

@@ -1515,7 +1515,7 @@ struct file_operations {
 	int (*setlease)(struct file *, long, struct file_lock **, void **);
 	int (*setlease)(struct file *, long, struct file_lock **, void **);
 	long (*fallocate)(struct file *file, int mode, loff_t offset,
 	long (*fallocate)(struct file *file, int mode, loff_t offset,
 			  loff_t len);
 			  loff_t len);
-	int (*show_fdinfo)(struct seq_file *m, struct file *f);
+	void (*show_fdinfo)(struct seq_file *m, struct file *f);
 };
 };
 
 
 struct inode_operations {
 struct inode_operations {

+ 15 - 0
include/linux/seq_file.h

@@ -42,6 +42,21 @@ struct seq_operations {
 
 
 #define SEQ_SKIP 1
 #define SEQ_SKIP 1
 
 
+/**
+ * seq_has_overflowed - check if the buffer has overflowed
+ * @m: the seq_file handle
+ *
+ * seq_files have a buffer which may overflow. When this happens a larger
+ * buffer is reallocated and all the data will be printed again.
+ * The overflow state is true when m->count == m->size.
+ *
+ * Returns true if the buffer received more than it can hold.
+ */
+static inline bool seq_has_overflowed(struct seq_file *m)
+{
+	return m->count == m->size;
+}
+
 /**
 /**
  * seq_get_buf - get buffer to write arbitrary data to
  * seq_get_buf - get buffer to write arbitrary data to
  * @m: the seq_file handle
  * @m: the seq_file handle

+ 1 - 1
include/net/netfilter/nf_conntrack_core.h

@@ -72,7 +72,7 @@ static inline int nf_conntrack_confirm(struct sk_buff *skb)
 	return ret;
 	return ret;
 }
 }
 
 
-int
+void
 print_tuple(struct seq_file *s, const struct nf_conntrack_tuple *tuple,
 print_tuple(struct seq_file *s, const struct nf_conntrack_tuple *tuple,
             const struct nf_conntrack_l3proto *l3proto,
             const struct nf_conntrack_l3proto *l3proto,
             const struct nf_conntrack_l4proto *proto);
             const struct nf_conntrack_l4proto *proto);

+ 2 - 2
include/net/netfilter/nf_conntrack_l3proto.h

@@ -38,8 +38,8 @@ struct nf_conntrack_l3proto {
 			     const struct nf_conntrack_tuple *orig);
 			     const struct nf_conntrack_tuple *orig);
 
 
 	/* Print out the per-protocol part of the tuple. */
 	/* Print out the per-protocol part of the tuple. */
-	int (*print_tuple)(struct seq_file *s,
-			   const struct nf_conntrack_tuple *);
+	void (*print_tuple)(struct seq_file *s,
+			    const struct nf_conntrack_tuple *);
 
 
 	/*
 	/*
 	 * Called before tracking. 
 	 * Called before tracking. 

+ 3 - 3
include/net/netfilter/nf_conntrack_l4proto.h

@@ -56,11 +56,11 @@ struct nf_conntrack_l4proto {
 		     u_int8_t pf, unsigned int hooknum);
 		     u_int8_t pf, unsigned int hooknum);
 
 
 	/* Print out the per-protocol part of the tuple. Return like seq_* */
 	/* Print out the per-protocol part of the tuple. Return like seq_* */
-	int (*print_tuple)(struct seq_file *s,
-			   const struct nf_conntrack_tuple *);
+	void (*print_tuple)(struct seq_file *s,
+			    const struct nf_conntrack_tuple *);
 
 
 	/* Print out the private part of the conntrack. */
 	/* Print out the private part of the conntrack. */
-	int (*print_conntrack)(struct seq_file *s, struct nf_conn *);
+	void (*print_conntrack)(struct seq_file *s, struct nf_conn *);
 
 
 	/* Return the array of timeouts for this protocol. */
 	/* Return the array of timeouts for this protocol. */
 	unsigned int *(*get_timeouts)(struct net *net);
 	unsigned int *(*get_timeouts)(struct net *net);

+ 3 - 3
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c

@@ -56,11 +56,11 @@ static bool ipv4_invert_tuple(struct nf_conntrack_tuple *tuple,
 	return true;
 	return true;
 }
 }
 
 
-static int ipv4_print_tuple(struct seq_file *s,
+static void ipv4_print_tuple(struct seq_file *s,
 			    const struct nf_conntrack_tuple *tuple)
 			    const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "src=%pI4 dst=%pI4 ",
-			  &tuple->src.u3.ip, &tuple->dst.u3.ip);
+	seq_printf(s, "src=%pI4 dst=%pI4 ",
+		   &tuple->src.u3.ip, &tuple->dst.u3.ip);
 }
 }
 
 
 static int ipv4_get_l4proto(const struct sk_buff *skb, unsigned int nhoff,
 static int ipv4_get_l4proto(const struct sk_buff *skb, unsigned int nhoff,

+ 28 - 25
net/ipv4/netfilter/nf_conntrack_l3proto_ipv4_compat.c

@@ -94,7 +94,7 @@ static void ct_seq_stop(struct seq_file *s, void *v)
 }
 }
 
 
 #ifdef CONFIG_NF_CONNTRACK_SECMARK
 #ifdef CONFIG_NF_CONNTRACK_SECMARK
-static int ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
+static void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
 {
 {
 	int ret;
 	int ret;
 	u32 len;
 	u32 len;
@@ -102,17 +102,15 @@ static int ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
 
 
 	ret = security_secid_to_secctx(ct->secmark, &secctx, &len);
 	ret = security_secid_to_secctx(ct->secmark, &secctx, &len);
 	if (ret)
 	if (ret)
-		return 0;
+		return;
 
 
-	ret = seq_printf(s, "secctx=%s ", secctx);
+	seq_printf(s, "secctx=%s ", secctx);
 
 
 	security_release_secctx(secctx, len);
 	security_release_secctx(secctx, len);
-	return ret;
 }
 }
 #else
 #else
-static inline int ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
+static inline void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
 {
 {
-	return 0;
 }
 }
 #endif
 #endif
 
 
@@ -141,47 +139,52 @@ static int ct_seq_show(struct seq_file *s, void *v)
 	NF_CT_ASSERT(l4proto);
 	NF_CT_ASSERT(l4proto);
 
 
 	ret = -ENOSPC;
 	ret = -ENOSPC;
-	if (seq_printf(s, "%-8s %u %ld ",
-		      l4proto->name, nf_ct_protonum(ct),
-		      timer_pending(&ct->timeout)
-		      ? (long)(ct->timeout.expires - jiffies)/HZ : 0) != 0)
-		goto release;
+	seq_printf(s, "%-8s %u %ld ",
+		   l4proto->name, nf_ct_protonum(ct),
+		   timer_pending(&ct->timeout)
+		   ? (long)(ct->timeout.expires - jiffies)/HZ : 0);
+
+	if (l4proto->print_conntrack)
+		l4proto->print_conntrack(s, ct);
 
 
-	if (l4proto->print_conntrack && l4proto->print_conntrack(s, ct))
+	if (seq_has_overflowed(s))
 		goto release;
 		goto release;
 
 
-	if (print_tuple(s, &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
-			l3proto, l4proto))
+	print_tuple(s, &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
+		    l3proto, l4proto);
+
+	if (seq_has_overflowed(s))
 		goto release;
 		goto release;
 
 
 	if (seq_print_acct(s, ct, IP_CT_DIR_ORIGINAL))
 	if (seq_print_acct(s, ct, IP_CT_DIR_ORIGINAL))
 		goto release;
 		goto release;
 
 
 	if (!(test_bit(IPS_SEEN_REPLY_BIT, &ct->status)))
 	if (!(test_bit(IPS_SEEN_REPLY_BIT, &ct->status)))
-		if (seq_printf(s, "[UNREPLIED] "))
-			goto release;
+		seq_printf(s, "[UNREPLIED] ");
 
 
-	if (print_tuple(s, &ct->tuplehash[IP_CT_DIR_REPLY].tuple,
-			l3proto, l4proto))
+	print_tuple(s, &ct->tuplehash[IP_CT_DIR_REPLY].tuple,
+		    l3proto, l4proto);
+
+	if (seq_has_overflowed(s))
 		goto release;
 		goto release;
 
 
 	if (seq_print_acct(s, ct, IP_CT_DIR_REPLY))
 	if (seq_print_acct(s, ct, IP_CT_DIR_REPLY))
 		goto release;
 		goto release;
 
 
 	if (test_bit(IPS_ASSURED_BIT, &ct->status))
 	if (test_bit(IPS_ASSURED_BIT, &ct->status))
-		if (seq_printf(s, "[ASSURED] "))
-			goto release;
+		seq_printf(s, "[ASSURED] ");
 
 
 #ifdef CONFIG_NF_CONNTRACK_MARK
 #ifdef CONFIG_NF_CONNTRACK_MARK
-	if (seq_printf(s, "mark=%u ", ct->mark))
-		goto release;
+	seq_printf(s, "mark=%u ", ct->mark);
 #endif
 #endif
 
 
-	if (ct_show_secctx(s, ct))
-		goto release;
+	ct_show_secctx(s, ct);
 
 
-	if (seq_printf(s, "use=%u\n", atomic_read(&ct->ct_general.use)))
+	seq_printf(s, "use=%u\n", atomic_read(&ct->ct_general.use));
+
+	if (seq_has_overflowed(s))
 		goto release;
 		goto release;
+
 	ret = 0;
 	ret = 0;
 release:
 release:
 	nf_ct_put(ct);
 	nf_ct_put(ct);

+ 5 - 5
net/ipv4/netfilter/nf_conntrack_proto_icmp.c

@@ -72,13 +72,13 @@ static bool icmp_invert_tuple(struct nf_conntrack_tuple *tuple,
 }
 }
 
 
 /* Print out the per-protocol part of the tuple. */
 /* Print out the per-protocol part of the tuple. */
-static int icmp_print_tuple(struct seq_file *s,
+static void icmp_print_tuple(struct seq_file *s,
 			    const struct nf_conntrack_tuple *tuple)
 			    const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "type=%u code=%u id=%u ",
-			  tuple->dst.u.icmp.type,
-			  tuple->dst.u.icmp.code,
-			  ntohs(tuple->src.u.icmp.id));
+	seq_printf(s, "type=%u code=%u id=%u ",
+		   tuple->dst.u.icmp.type,
+		   tuple->dst.u.icmp.code,
+		   ntohs(tuple->src.u.icmp.id));
 }
 }
 
 
 static unsigned int *icmp_get_timeouts(struct net *net)
 static unsigned int *icmp_get_timeouts(struct net *net)

+ 3 - 3
net/ipv6/netfilter/nf_conntrack_l3proto_ipv6.c

@@ -60,11 +60,11 @@ static bool ipv6_invert_tuple(struct nf_conntrack_tuple *tuple,
 	return true;
 	return true;
 }
 }
 
 
-static int ipv6_print_tuple(struct seq_file *s,
+static void ipv6_print_tuple(struct seq_file *s,
 			    const struct nf_conntrack_tuple *tuple)
 			    const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "src=%pI6 dst=%pI6 ",
-			  tuple->src.u3.ip6, tuple->dst.u3.ip6);
+	seq_printf(s, "src=%pI6 dst=%pI6 ",
+		   tuple->src.u3.ip6, tuple->dst.u3.ip6);
 }
 }
 
 
 static int ipv6_get_l4proto(const struct sk_buff *skb, unsigned int nhoff,
 static int ipv6_get_l4proto(const struct sk_buff *skb, unsigned int nhoff,

+ 5 - 5
net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c

@@ -84,13 +84,13 @@ static bool icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple,
 }
 }
 
 
 /* Print out the per-protocol part of the tuple. */
 /* Print out the per-protocol part of the tuple. */
-static int icmpv6_print_tuple(struct seq_file *s,
+static void icmpv6_print_tuple(struct seq_file *s,
 			      const struct nf_conntrack_tuple *tuple)
 			      const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "type=%u code=%u id=%u ",
-			  tuple->dst.u.icmp.type,
-			  tuple->dst.u.icmp.code,
-			  ntohs(tuple->src.u.icmp.id));
+	seq_printf(s, "type=%u code=%u id=%u ",
+		   tuple->dst.u.icmp.type,
+		   tuple->dst.u.icmp.code,
+		   ntohs(tuple->src.u.icmp.id));
 }
 }
 
 
 static unsigned int *icmpv6_get_timeouts(struct net *net)
 static unsigned int *icmpv6_get_timeouts(struct net *net)

+ 2 - 3
net/netfilter/nf_conntrack_l3proto_generic.c

@@ -49,10 +49,9 @@ static bool generic_invert_tuple(struct nf_conntrack_tuple *tuple,
 	return true;
 	return true;
 }
 }
 
 
-static int generic_print_tuple(struct seq_file *s,
-			    const struct nf_conntrack_tuple *tuple)
+static void generic_print_tuple(struct seq_file *s,
+				const struct nf_conntrack_tuple *tuple)
 {
 {
-	return 0;
 }
 }
 
 
 static int generic_get_l4proto(const struct sk_buff *skb, unsigned int nhoff,
 static int generic_get_l4proto(const struct sk_buff *skb, unsigned int nhoff,

+ 7 - 7
net/netfilter/nf_conntrack_proto_dccp.c

@@ -618,17 +618,17 @@ out_invalid:
 	return -NF_ACCEPT;
 	return -NF_ACCEPT;
 }
 }
 
 
-static int dccp_print_tuple(struct seq_file *s,
-			    const struct nf_conntrack_tuple *tuple)
+static void dccp_print_tuple(struct seq_file *s,
+			     const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "sport=%hu dport=%hu ",
-			  ntohs(tuple->src.u.dccp.port),
-			  ntohs(tuple->dst.u.dccp.port));
+	seq_printf(s, "sport=%hu dport=%hu ",
+		   ntohs(tuple->src.u.dccp.port),
+		   ntohs(tuple->dst.u.dccp.port));
 }
 }
 
 
-static int dccp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
+static void dccp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
 {
 {
-	return seq_printf(s, "%s ", dccp_state_names[ct->proto.dccp.state]);
+	seq_printf(s, "%s ", dccp_state_names[ct->proto.dccp.state]);
 }
 }
 
 
 #if IS_ENABLED(CONFIG_NF_CT_NETLINK)
 #if IS_ENABLED(CONFIG_NF_CT_NETLINK)

+ 2 - 3
net/netfilter/nf_conntrack_proto_generic.c

@@ -63,10 +63,9 @@ static bool generic_invert_tuple(struct nf_conntrack_tuple *tuple,
 }
 }
 
 
 /* Print out the per-protocol part of the tuple. */
 /* Print out the per-protocol part of the tuple. */
-static int generic_print_tuple(struct seq_file *s,
-			       const struct nf_conntrack_tuple *tuple)
+static void generic_print_tuple(struct seq_file *s,
+				const struct nf_conntrack_tuple *tuple)
 {
 {
-	return 0;
 }
 }
 
 
 static unsigned int *generic_get_timeouts(struct net *net)
 static unsigned int *generic_get_timeouts(struct net *net)

+ 9 - 9
net/netfilter/nf_conntrack_proto_gre.c

@@ -226,20 +226,20 @@ static bool gre_pkt_to_tuple(const struct sk_buff *skb, unsigned int dataoff,
 }
 }
 
 
 /* print gre part of tuple */
 /* print gre part of tuple */
-static int gre_print_tuple(struct seq_file *s,
-			   const struct nf_conntrack_tuple *tuple)
+static void gre_print_tuple(struct seq_file *s,
+			    const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "srckey=0x%x dstkey=0x%x ",
-			  ntohs(tuple->src.u.gre.key),
-			  ntohs(tuple->dst.u.gre.key));
+	seq_printf(s, "srckey=0x%x dstkey=0x%x ",
+		   ntohs(tuple->src.u.gre.key),
+		   ntohs(tuple->dst.u.gre.key));
 }
 }
 
 
 /* print private data for conntrack */
 /* print private data for conntrack */
-static int gre_print_conntrack(struct seq_file *s, struct nf_conn *ct)
+static void gre_print_conntrack(struct seq_file *s, struct nf_conn *ct)
 {
 {
-	return seq_printf(s, "timeout=%u, stream_timeout=%u ",
-			  (ct->proto.gre.timeout / HZ),
-			  (ct->proto.gre.stream_timeout / HZ));
+	seq_printf(s, "timeout=%u, stream_timeout=%u ",
+		   (ct->proto.gre.timeout / HZ),
+		   (ct->proto.gre.stream_timeout / HZ));
 }
 }
 
 
 static unsigned int *gre_get_timeouts(struct net *net)
 static unsigned int *gre_get_timeouts(struct net *net)

+ 7 - 7
net/netfilter/nf_conntrack_proto_sctp.c

@@ -166,16 +166,16 @@ static bool sctp_invert_tuple(struct nf_conntrack_tuple *tuple,
 }
 }
 
 
 /* Print out the per-protocol part of the tuple. */
 /* Print out the per-protocol part of the tuple. */
-static int sctp_print_tuple(struct seq_file *s,
-			    const struct nf_conntrack_tuple *tuple)
+static void sctp_print_tuple(struct seq_file *s,
+			     const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "sport=%hu dport=%hu ",
-			  ntohs(tuple->src.u.sctp.port),
-			  ntohs(tuple->dst.u.sctp.port));
+	seq_printf(s, "sport=%hu dport=%hu ",
+		   ntohs(tuple->src.u.sctp.port),
+		   ntohs(tuple->dst.u.sctp.port));
 }
 }
 
 
 /* Print out the private part of the conntrack. */
 /* Print out the private part of the conntrack. */
-static int sctp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
+static void sctp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
 {
 {
 	enum sctp_conntrack state;
 	enum sctp_conntrack state;
 
 
@@ -183,7 +183,7 @@ static int sctp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
 	state = ct->proto.sctp.state;
 	state = ct->proto.sctp.state;
 	spin_unlock_bh(&ct->lock);
 	spin_unlock_bh(&ct->lock);
 
 
-	return seq_printf(s, "%s ", sctp_conntrack_names[state]);
+	seq_printf(s, "%s ", sctp_conntrack_names[state]);
 }
 }
 
 
 #define for_each_sctp_chunk(skb, sch, _sch, offset, dataoff, count)	\
 #define for_each_sctp_chunk(skb, sch, _sch, offset, dataoff, count)	\

+ 7 - 7
net/netfilter/nf_conntrack_proto_tcp.c

@@ -302,16 +302,16 @@ static bool tcp_invert_tuple(struct nf_conntrack_tuple *tuple,
 }
 }
 
 
 /* Print out the per-protocol part of the tuple. */
 /* Print out the per-protocol part of the tuple. */
-static int tcp_print_tuple(struct seq_file *s,
-			   const struct nf_conntrack_tuple *tuple)
+static void tcp_print_tuple(struct seq_file *s,
+			    const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "sport=%hu dport=%hu ",
-			  ntohs(tuple->src.u.tcp.port),
-			  ntohs(tuple->dst.u.tcp.port));
+	seq_printf(s, "sport=%hu dport=%hu ",
+		   ntohs(tuple->src.u.tcp.port),
+		   ntohs(tuple->dst.u.tcp.port));
 }
 }
 
 
 /* Print out the private part of the conntrack. */
 /* Print out the private part of the conntrack. */
-static int tcp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
+static void tcp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
 {
 {
 	enum tcp_conntrack state;
 	enum tcp_conntrack state;
 
 
@@ -319,7 +319,7 @@ static int tcp_print_conntrack(struct seq_file *s, struct nf_conn *ct)
 	state = ct->proto.tcp.state;
 	state = ct->proto.tcp.state;
 	spin_unlock_bh(&ct->lock);
 	spin_unlock_bh(&ct->lock);
 
 
-	return seq_printf(s, "%s ", tcp_conntrack_names[state]);
+	seq_printf(s, "%s ", tcp_conntrack_names[state]);
 }
 }
 
 
 static unsigned int get_conntrack_index(const struct tcphdr *tcph)
 static unsigned int get_conntrack_index(const struct tcphdr *tcph)

+ 5 - 5
net/netfilter/nf_conntrack_proto_udp.c

@@ -63,12 +63,12 @@ static bool udp_invert_tuple(struct nf_conntrack_tuple *tuple,
 }
 }
 
 
 /* Print out the per-protocol part of the tuple. */
 /* Print out the per-protocol part of the tuple. */
-static int udp_print_tuple(struct seq_file *s,
-			   const struct nf_conntrack_tuple *tuple)
+static void udp_print_tuple(struct seq_file *s,
+			    const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "sport=%hu dport=%hu ",
-			  ntohs(tuple->src.u.udp.port),
-			  ntohs(tuple->dst.u.udp.port));
+	seq_printf(s, "sport=%hu dport=%hu ",
+		   ntohs(tuple->src.u.udp.port),
+		   ntohs(tuple->dst.u.udp.port));
 }
 }
 
 
 static unsigned int *udp_get_timeouts(struct net *net)
 static unsigned int *udp_get_timeouts(struct net *net)

+ 5 - 5
net/netfilter/nf_conntrack_proto_udplite.c

@@ -71,12 +71,12 @@ static bool udplite_invert_tuple(struct nf_conntrack_tuple *tuple,
 }
 }
 
 
 /* Print out the per-protocol part of the tuple. */
 /* Print out the per-protocol part of the tuple. */
-static int udplite_print_tuple(struct seq_file *s,
-			       const struct nf_conntrack_tuple *tuple)
+static void udplite_print_tuple(struct seq_file *s,
+				const struct nf_conntrack_tuple *tuple)
 {
 {
-	return seq_printf(s, "sport=%hu dport=%hu ",
-			  ntohs(tuple->src.u.udp.port),
-			  ntohs(tuple->dst.u.udp.port));
+	seq_printf(s, "sport=%hu dport=%hu ",
+		   ntohs(tuple->src.u.udp.port),
+		   ntohs(tuple->dst.u.udp.port));
 }
 }
 
 
 static unsigned int *udplite_get_timeouts(struct net *net)
 static unsigned int *udplite_get_timeouts(struct net *net)

+ 37 - 40
net/netfilter/nf_conntrack_standalone.c

@@ -36,12 +36,13 @@
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");
 
 
 #ifdef CONFIG_NF_CONNTRACK_PROCFS
 #ifdef CONFIG_NF_CONNTRACK_PROCFS
-int
+void
 print_tuple(struct seq_file *s, const struct nf_conntrack_tuple *tuple,
 print_tuple(struct seq_file *s, const struct nf_conntrack_tuple *tuple,
             const struct nf_conntrack_l3proto *l3proto,
             const struct nf_conntrack_l3proto *l3proto,
             const struct nf_conntrack_l4proto *l4proto)
             const struct nf_conntrack_l4proto *l4proto)
 {
 {
-	return l3proto->print_tuple(s, tuple) || l4proto->print_tuple(s, tuple);
+	l3proto->print_tuple(s, tuple);
+	l4proto->print_tuple(s, tuple);
 }
 }
 EXPORT_SYMBOL_GPL(print_tuple);
 EXPORT_SYMBOL_GPL(print_tuple);
 
 
@@ -119,7 +120,7 @@ static void ct_seq_stop(struct seq_file *s, void *v)
 }
 }
 
 
 #ifdef CONFIG_NF_CONNTRACK_SECMARK
 #ifdef CONFIG_NF_CONNTRACK_SECMARK
-static int ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
+static void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
 {
 {
 	int ret;
 	int ret;
 	u32 len;
 	u32 len;
@@ -127,22 +128,20 @@ static int ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
 
 
 	ret = security_secid_to_secctx(ct->secmark, &secctx, &len);
 	ret = security_secid_to_secctx(ct->secmark, &secctx, &len);
 	if (ret)
 	if (ret)
-		return 0;
+		return;
 
 
-	ret = seq_printf(s, "secctx=%s ", secctx);
+	seq_printf(s, "secctx=%s ", secctx);
 
 
 	security_release_secctx(secctx, len);
 	security_release_secctx(secctx, len);
-	return ret;
 }
 }
 #else
 #else
-static inline int ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
+static inline void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
 {
 {
-	return 0;
 }
 }
 #endif
 #endif
 
 
 #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
 #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
-static int ct_show_delta_time(struct seq_file *s, const struct nf_conn *ct)
+static void ct_show_delta_time(struct seq_file *s, const struct nf_conn *ct)
 {
 {
 	struct ct_iter_state *st = s->private;
 	struct ct_iter_state *st = s->private;
 	struct nf_conn_tstamp *tstamp;
 	struct nf_conn_tstamp *tstamp;
@@ -156,16 +155,15 @@ static int ct_show_delta_time(struct seq_file *s, const struct nf_conn *ct)
 		else
 		else
 			delta_time = 0;
 			delta_time = 0;
 
 
-		return seq_printf(s, "delta-time=%llu ",
-				  (unsigned long long)delta_time);
+		seq_printf(s, "delta-time=%llu ",
+			   (unsigned long long)delta_time);
 	}
 	}
-	return 0;
+	return;
 }
 }
 #else
 #else
-static inline int
+static inline void
 ct_show_delta_time(struct seq_file *s, const struct nf_conn *ct)
 ct_show_delta_time(struct seq_file *s, const struct nf_conn *ct)
 {
 {
-	return 0;
 }
 }
 #endif
 #endif
 
 
@@ -192,55 +190,54 @@ static int ct_seq_show(struct seq_file *s, void *v)
 	NF_CT_ASSERT(l4proto);
 	NF_CT_ASSERT(l4proto);
 
 
 	ret = -ENOSPC;
 	ret = -ENOSPC;
-	if (seq_printf(s, "%-8s %u %-8s %u %ld ",
-		       l3proto->name, nf_ct_l3num(ct),
-		       l4proto->name, nf_ct_protonum(ct),
-		       timer_pending(&ct->timeout)
-		       ? (long)(ct->timeout.expires - jiffies)/HZ : 0) != 0)
-		goto release;
+	seq_printf(s, "%-8s %u %-8s %u %ld ",
+		   l3proto->name, nf_ct_l3num(ct),
+		   l4proto->name, nf_ct_protonum(ct),
+		   timer_pending(&ct->timeout)
+		   ? (long)(ct->timeout.expires - jiffies)/HZ : 0);
 
 
-	if (l4proto->print_conntrack && l4proto->print_conntrack(s, ct))
-		goto release;
+	if (l4proto->print_conntrack)
+		l4proto->print_conntrack(s, ct);
+
+	print_tuple(s, &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
+		    l3proto, l4proto);
 
 
-	if (print_tuple(s, &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
-			l3proto, l4proto))
+	if (seq_has_overflowed(s))
 		goto release;
 		goto release;
 
 
 	if (seq_print_acct(s, ct, IP_CT_DIR_ORIGINAL))
 	if (seq_print_acct(s, ct, IP_CT_DIR_ORIGINAL))
 		goto release;
 		goto release;
 
 
 	if (!(test_bit(IPS_SEEN_REPLY_BIT, &ct->status)))
 	if (!(test_bit(IPS_SEEN_REPLY_BIT, &ct->status)))
-		if (seq_printf(s, "[UNREPLIED] "))
-			goto release;
+		seq_printf(s, "[UNREPLIED] ");
 
 
-	if (print_tuple(s, &ct->tuplehash[IP_CT_DIR_REPLY].tuple,
-			l3proto, l4proto))
-		goto release;
+	print_tuple(s, &ct->tuplehash[IP_CT_DIR_REPLY].tuple,
+		    l3proto, l4proto);
 
 
 	if (seq_print_acct(s, ct, IP_CT_DIR_REPLY))
 	if (seq_print_acct(s, ct, IP_CT_DIR_REPLY))
 		goto release;
 		goto release;
 
 
 	if (test_bit(IPS_ASSURED_BIT, &ct->status))
 	if (test_bit(IPS_ASSURED_BIT, &ct->status))
-		if (seq_printf(s, "[ASSURED] "))
-			goto release;
+		seq_printf(s, "[ASSURED] ");
 
 
-#if defined(CONFIG_NF_CONNTRACK_MARK)
-	if (seq_printf(s, "mark=%u ", ct->mark))
+	if (seq_has_overflowed(s))
 		goto release;
 		goto release;
+
+#if defined(CONFIG_NF_CONNTRACK_MARK)
+	seq_printf(s, "mark=%u ", ct->mark);
 #endif
 #endif
 
 
-	if (ct_show_secctx(s, ct))
-		goto release;
+	ct_show_secctx(s, ct);
 
 
 #ifdef CONFIG_NF_CONNTRACK_ZONES
 #ifdef CONFIG_NF_CONNTRACK_ZONES
-	if (seq_printf(s, "zone=%u ", nf_ct_zone(ct)))
-		goto release;
+	seq_printf(s, "zone=%u ", nf_ct_zone(ct));
 #endif
 #endif
 
 
-	if (ct_show_delta_time(s, ct))
-		goto release;
+	ct_show_delta_time(s, ct);
+
+	seq_printf(s, "use=%u\n", atomic_read(&ct->ct_general.use));
 
 
-	if (seq_printf(s, "use=%u\n", atomic_read(&ct->ct_general.use)))
+	if (seq_has_overflowed(s))
 		goto release;
 		goto release;
 
 
 	ret = 0;
 	ret = 0;

+ 16 - 14
net/netfilter/nf_log.c

@@ -294,19 +294,19 @@ static int seq_show(struct seq_file *s, void *v)
 {
 {
 	loff_t *pos = v;
 	loff_t *pos = v;
 	const struct nf_logger *logger;
 	const struct nf_logger *logger;
-	int i, ret;
+	int i;
 	struct net *net = seq_file_net(s);
 	struct net *net = seq_file_net(s);
 
 
 	logger = rcu_dereference_protected(net->nf.nf_loggers[*pos],
 	logger = rcu_dereference_protected(net->nf.nf_loggers[*pos],
 					   lockdep_is_held(&nf_log_mutex));
 					   lockdep_is_held(&nf_log_mutex));
 
 
 	if (!logger)
 	if (!logger)
-		ret = seq_printf(s, "%2lld NONE (", *pos);
+		seq_printf(s, "%2lld NONE (", *pos);
 	else
 	else
-		ret = seq_printf(s, "%2lld %s (", *pos, logger->name);
+		seq_printf(s, "%2lld %s (", *pos, logger->name);
 
 
-	if (ret < 0)
-		return ret;
+	if (seq_has_overflowed(s))
+		return -ENOSPC;
 
 
 	for (i = 0; i < NF_LOG_TYPE_MAX; i++) {
 	for (i = 0; i < NF_LOG_TYPE_MAX; i++) {
 		if (loggers[*pos][i] == NULL)
 		if (loggers[*pos][i] == NULL)
@@ -314,17 +314,19 @@ static int seq_show(struct seq_file *s, void *v)
 
 
 		logger = rcu_dereference_protected(loggers[*pos][i],
 		logger = rcu_dereference_protected(loggers[*pos][i],
 					   lockdep_is_held(&nf_log_mutex));
 					   lockdep_is_held(&nf_log_mutex));
-		ret = seq_printf(s, "%s", logger->name);
-		if (ret < 0)
-			return ret;
-		if (i == 0 && loggers[*pos][i + 1] != NULL) {
-			ret = seq_printf(s, ",");
-			if (ret < 0)
-				return ret;
-		}
+		seq_printf(s, "%s", logger->name);
+		if (i == 0 && loggers[*pos][i + 1] != NULL)
+			seq_printf(s, ",");
+
+		if (seq_has_overflowed(s))
+			return -ENOSPC;
 	}
 	}
 
 
-	return seq_printf(s, ")\n");
+	seq_printf(s, ")\n");
+
+	if (seq_has_overflowed(s))
+		return -ENOSPC;
+	return 0;
 }
 }
 
 
 static const struct seq_operations nflog_seq_ops = {
 static const struct seq_operations nflog_seq_ops = {

+ 7 - 6
net/netfilter/nfnetlink_queue_core.c

@@ -1242,12 +1242,13 @@ static int seq_show(struct seq_file *s, void *v)
 {
 {
 	const struct nfqnl_instance *inst = v;
 	const struct nfqnl_instance *inst = v;
 
 
-	return seq_printf(s, "%5d %6d %5d %1d %5d %5d %5d %8d %2d\n",
-			  inst->queue_num,
-			  inst->peer_portid, inst->queue_total,
-			  inst->copy_mode, inst->copy_range,
-			  inst->queue_dropped, inst->queue_user_dropped,
-			  inst->id_sequence, 1);
+	seq_printf(s, "%5d %6d %5d %1d %5d %5d %5d %8d %2d\n",
+		   inst->queue_num,
+		   inst->peer_portid, inst->queue_total,
+		   inst->copy_mode, inst->copy_range,
+		   inst->queue_dropped, inst->queue_user_dropped,
+		   inst->id_sequence, 1);
+	return seq_has_overflowed(s);
 }
 }
 
 
 static const struct seq_operations nfqnl_seq_ops = {
 static const struct seq_operations nfqnl_seq_ops = {

+ 12 - 7
net/netfilter/x_tables.c

@@ -947,9 +947,10 @@ static int xt_table_seq_show(struct seq_file *seq, void *v)
 {
 {
 	struct xt_table *table = list_entry(v, struct xt_table, list);
 	struct xt_table *table = list_entry(v, struct xt_table, list);
 
 
-	if (strlen(table->name))
-		return seq_printf(seq, "%s\n", table->name);
-	else
+	if (strlen(table->name)) {
+		seq_printf(seq, "%s\n", table->name);
+		return seq_has_overflowed(seq);
+	} else
 		return 0;
 		return 0;
 }
 }
 
 
@@ -1086,8 +1087,10 @@ static int xt_match_seq_show(struct seq_file *seq, void *v)
 		if (trav->curr == trav->head)
 		if (trav->curr == trav->head)
 			return 0;
 			return 0;
 		match = list_entry(trav->curr, struct xt_match, list);
 		match = list_entry(trav->curr, struct xt_match, list);
-		return (*match->name == '\0') ? 0 :
-		       seq_printf(seq, "%s\n", match->name);
+		if (*match->name == '\0')
+			return 0;
+		seq_printf(seq, "%s\n", match->name);
+		return seq_has_overflowed(seq);
 	}
 	}
 	return 0;
 	return 0;
 }
 }
@@ -1139,8 +1142,10 @@ static int xt_target_seq_show(struct seq_file *seq, void *v)
 		if (trav->curr == trav->head)
 		if (trav->curr == trav->head)
 			return 0;
 			return 0;
 		target = list_entry(trav->curr, struct xt_target, list);
 		target = list_entry(trav->curr, struct xt_target, list);
-		return (*target->name == '\0') ? 0 :
-		       seq_printf(seq, "%s\n", target->name);
+		if (*target->name == '\0')
+			return 0;
+		seq_printf(seq, "%s\n", target->name);
+		return seq_has_overflowed(seq);
 	}
 	}
 	return 0;
 	return 0;
 }
 }

+ 17 - 19
net/netfilter/xt_hashlimit.c

@@ -789,7 +789,6 @@ static void dl_seq_stop(struct seq_file *s, void *v)
 static int dl_seq_real_show(struct dsthash_ent *ent, u_int8_t family,
 static int dl_seq_real_show(struct dsthash_ent *ent, u_int8_t family,
 				   struct seq_file *s)
 				   struct seq_file *s)
 {
 {
-	int res;
 	const struct xt_hashlimit_htable *ht = s->private;
 	const struct xt_hashlimit_htable *ht = s->private;
 
 
 	spin_lock(&ent->lock);
 	spin_lock(&ent->lock);
@@ -798,33 +797,32 @@ static int dl_seq_real_show(struct dsthash_ent *ent, u_int8_t family,
 
 
 	switch (family) {
 	switch (family) {
 	case NFPROTO_IPV4:
 	case NFPROTO_IPV4:
-		res = seq_printf(s, "%ld %pI4:%u->%pI4:%u %u %u %u\n",
-				 (long)(ent->expires - jiffies)/HZ,
-				 &ent->dst.ip.src,
-				 ntohs(ent->dst.src_port),
-				 &ent->dst.ip.dst,
-				 ntohs(ent->dst.dst_port),
-				 ent->rateinfo.credit, ent->rateinfo.credit_cap,
-				 ent->rateinfo.cost);
+		seq_printf(s, "%ld %pI4:%u->%pI4:%u %u %u %u\n",
+			   (long)(ent->expires - jiffies)/HZ,
+			   &ent->dst.ip.src,
+			   ntohs(ent->dst.src_port),
+			   &ent->dst.ip.dst,
+			   ntohs(ent->dst.dst_port),
+			   ent->rateinfo.credit, ent->rateinfo.credit_cap,
+			   ent->rateinfo.cost);
 		break;
 		break;
 #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
 #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES)
 	case NFPROTO_IPV6:
 	case NFPROTO_IPV6:
-		res = seq_printf(s, "%ld %pI6:%u->%pI6:%u %u %u %u\n",
-				 (long)(ent->expires - jiffies)/HZ,
-				 &ent->dst.ip6.src,
-				 ntohs(ent->dst.src_port),
-				 &ent->dst.ip6.dst,
-				 ntohs(ent->dst.dst_port),
-				 ent->rateinfo.credit, ent->rateinfo.credit_cap,
-				 ent->rateinfo.cost);
+		seq_printf(s, "%ld %pI6:%u->%pI6:%u %u %u %u\n",
+			   (long)(ent->expires - jiffies)/HZ,
+			   &ent->dst.ip6.src,
+			   ntohs(ent->dst.src_port),
+			   &ent->dst.ip6.dst,
+			   ntohs(ent->dst.dst_port),
+			   ent->rateinfo.credit, ent->rateinfo.credit_cap,
+			   ent->rateinfo.cost);
 		break;
 		break;
 #endif
 #endif
 	default:
 	default:
 		BUG();
 		BUG();
-		res = 0;
 	}
 	}
 	spin_unlock(&ent->lock);
 	spin_unlock(&ent->lock);
-	return res;
+	return seq_has_overflowed(s);
 }
 }
 
 
 static int dl_seq_show(struct seq_file *s, void *v)
 static int dl_seq_show(struct seq_file *s, void *v)