diff options
| author | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
|---|---|---|
| committer | Mark Brown <[email protected]> | 2015-10-12 18:09:27 +0100 | 
| commit | 79828b4fa835f73cdaf4bffa48696abdcbea9d02 (patch) | |
| tree | 5e0fa7156acb75ba603022bc807df8f2fedb97a8 /fs/seq_file.c | |
| parent | 721b51fcf91898299d96f4b72cb9434cda29dce6 (diff) | |
| parent | 8c1a9d6323abf0fb1e5dad96cf3f1c783505ea5a (diff) | |
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-fix-rt5645
Diffstat (limited to 'fs/seq_file.c')
| -rw-r--r-- | fs/seq_file.c | 112 | 
1 files changed, 73 insertions, 39 deletions
diff --git a/fs/seq_file.c b/fs/seq_file.c index ce9e39fd5daf..225586e141ca 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -12,6 +12,7 @@  #include <linux/slab.h>  #include <linux/cred.h>  #include <linux/mm.h> +#include <linux/printk.h>  #include <asm/uaccess.h>  #include <asm/page.h> @@ -371,16 +372,16 @@ EXPORT_SYMBOL(seq_release);   *	@esc:	set of characters that need escaping   *   *	Puts string into buffer, replacing each occurrence of character from - *	@esc with usual octal escape.  Returns 0 in case of success, -1 - in - *	case of overflow. + *	@esc with usual octal escape. + *	Use seq_has_overflowed() to check for errors.   */ -int seq_escape(struct seq_file *m, const char *s, const char *esc) +void seq_escape(struct seq_file *m, const char *s, const char *esc)  {  	char *end = m->buf + m->size; -        char *p; +	char *p;  	char c; -        for (p = m->buf + m->count; (c = *s) != '\0' && p < end; s++) { +	for (p = m->buf + m->count; (c = *s) != '\0' && p < end; s++) {  		if (!strchr(esc, c)) {  			*p++ = c;  			continue; @@ -393,14 +394,13 @@ int seq_escape(struct seq_file *m, const char *s, const char *esc)  			continue;  		}  		seq_set_overflow(m); -		return -1; -        } +		return; +	}  	m->count = p - m->buf; -        return 0;  }  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; @@ -408,24 +408,20 @@ int seq_vprintf(struct seq_file *m, const char *f, va_list args)  		len = vsnprintf(m->buf + m->count, m->size - m->count, f, args);  		if (m->count + len < m->size) {  			m->count += len; -			return 0; +			return;  		}  	}  	seq_set_overflow(m); -	return -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); @@ -663,26 +659,25 @@ 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; -	} -	return -1; +	if (m->count >= m->size) +		return; + +	m->buf[m->count++] = 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); @@ -693,8 +688,8 @@ EXPORT_SYMBOL(seq_puts);   * This routine is very quick when you show lots of numbers.   * In usual cases, it will be better to use seq_printf(). It's easier to read.   */ -int seq_put_decimal_ull(struct seq_file *m, char delimiter, -			unsigned long long num) +void seq_put_decimal_ull(struct seq_file *m, char delimiter, +			 unsigned long long num)  {  	int len; @@ -706,35 +701,33 @@ int seq_put_decimal_ull(struct seq_file *m, char delimiter,  	if (num < 10) {  		m->buf[m->count++] = num + '0'; -		return 0; +		return;  	}  	len = num_to_str(m->buf + m->count, m->size - m->count, num);  	if (!len)  		goto overflow;  	m->count += len; -	return 0; +	return; +  overflow:  	seq_set_overflow(m); -	return -1;  }  EXPORT_SYMBOL(seq_put_decimal_ull); -int seq_put_decimal_ll(struct seq_file *m, char delimiter, -			long long num) +void seq_put_decimal_ll(struct seq_file *m, char delimiter, long long num)  {  	if (num < 0) {  		if (m->count + 3 >= m->size) {  			seq_set_overflow(m); -			return -1; +			return;  		}  		if (delimiter)  			m->buf[m->count++] = delimiter;  		num = -num;  		delimiter = '-';  	} -	return seq_put_decimal_ull(m, delimiter, num); - +	seq_put_decimal_ull(m, delimiter, num);  }  EXPORT_SYMBOL(seq_put_decimal_ll); @@ -773,6 +766,47 @@ void seq_pad(struct seq_file *m, char c)  }  EXPORT_SYMBOL(seq_pad); +/* A complete analogue of print_hex_dump() */ +void seq_hex_dump(struct seq_file *m, const char *prefix_str, int prefix_type, +		  int rowsize, int groupsize, const void *buf, size_t len, +		  bool ascii) +{ +	const u8 *ptr = buf; +	int i, linelen, remaining = len; +	int ret; + +	if (rowsize != 16 && rowsize != 32) +		rowsize = 16; + +	for (i = 0; i < len && !seq_has_overflowed(m); i += rowsize) { +		linelen = min(remaining, rowsize); +		remaining -= rowsize; + +		switch (prefix_type) { +		case DUMP_PREFIX_ADDRESS: +			seq_printf(m, "%s%p: ", prefix_str, ptr + i); +			break; +		case DUMP_PREFIX_OFFSET: +			seq_printf(m, "%s%.8x: ", prefix_str, i); +			break; +		default: +			seq_printf(m, "%s", prefix_str); +			break; +		} + +		ret = hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize, +					 m->buf + m->count, m->size - m->count, +					 ascii); +		if (ret >= m->size - m->count) { +			seq_set_overflow(m); +		} else { +			m->count += ret; +			seq_putc(m, '\n'); +		} +	} +} +EXPORT_SYMBOL(seq_hex_dump); +  struct list_head *seq_list_start(struct list_head *head, loff_t pos)  {  	struct list_head *lh;  |