Lines Matching refs:m
25 static void seq_set_overflow(struct seq_file *m) in seq_set_overflow() argument
27 m->count = m->size; in seq_set_overflow()
91 static int traverse(struct seq_file *m, loff_t offset) in traverse() argument
97 m->version = 0; in traverse()
98 m->index = 0; in traverse()
99 m->count = m->from = 0; in traverse()
103 if (!m->buf) { in traverse()
104 m->buf = seq_buf_alloc(m->size = PAGE_SIZE); in traverse()
105 if (!m->buf) in traverse()
108 p = m->op->start(m, &m->index); in traverse()
113 error = m->op->show(m, p); in traverse()
118 m->count = 0; in traverse()
120 if (seq_has_overflowed(m)) in traverse()
122 p = m->op->next(m, p, &m->index); in traverse()
123 if (pos + m->count > offset) { in traverse()
124 m->from = offset - pos; in traverse()
125 m->count -= m->from; in traverse()
128 pos += m->count; in traverse()
129 m->count = 0; in traverse()
133 m->op->stop(m, p); in traverse()
137 m->op->stop(m, p); in traverse()
138 kvfree(m->buf); in traverse()
139 m->count = 0; in traverse()
140 m->buf = seq_buf_alloc(m->size <<= 1); in traverse()
141 return !m->buf ? -ENOMEM : -EAGAIN; in traverse()
155 struct seq_file *m = file->private_data; in seq_read() local
161 mutex_lock(&m->lock); in seq_read()
174 m->version = file->f_version; in seq_read()
181 m->index = 0; in seq_read()
182 m->version = 0; in seq_read()
183 m->count = 0; in seq_read()
187 if (unlikely(*ppos != m->read_pos)) { in seq_read()
188 while ((err = traverse(m, *ppos)) == -EAGAIN) in seq_read()
192 m->read_pos = 0; in seq_read()
193 m->version = 0; in seq_read()
194 m->index = 0; in seq_read()
195 m->count = 0; in seq_read()
198 m->read_pos = *ppos; in seq_read()
203 if (!m->buf) { in seq_read()
204 m->buf = seq_buf_alloc(m->size = PAGE_SIZE); in seq_read()
205 if (!m->buf) in seq_read()
209 if (m->count) { in seq_read()
210 n = min(m->count, size); in seq_read()
211 err = copy_to_user(buf, m->buf + m->from, n); in seq_read()
214 m->count -= n; in seq_read()
215 m->from += n; in seq_read()
223 m->from = 0; in seq_read()
224 p = m->op->start(m, &m->index); in seq_read()
229 err = m->op->show(m, p); in seq_read()
233 m->count = 0; in seq_read()
234 if (unlikely(!m->count)) { in seq_read()
235 p = m->op->next(m, p, &m->index); in seq_read()
238 if (m->count < m->size) in seq_read()
240 m->op->stop(m, p); in seq_read()
241 kvfree(m->buf); in seq_read()
242 m->count = 0; in seq_read()
243 m->buf = seq_buf_alloc(m->size <<= 1); in seq_read()
244 if (!m->buf) in seq_read()
246 m->version = 0; in seq_read()
247 p = m->op->start(m, &m->index); in seq_read()
249 m->op->stop(m, p); in seq_read()
250 m->count = 0; in seq_read()
255 size_t offs = m->count; in seq_read()
256 loff_t pos = m->index; in seq_read()
258 p = m->op->next(m, p, &m->index); in seq_read()
259 if (pos == m->index) in seq_read()
261 m->index++; in seq_read()
266 if (m->count >= size) in seq_read()
268 err = m->op->show(m, p); in seq_read()
269 if (seq_has_overflowed(m) || err) { in seq_read()
270 m->count = offs; in seq_read()
275 m->op->stop(m, p); in seq_read()
276 n = min(m->count, size); in seq_read()
277 err = copy_to_user(buf, m->buf, n); in seq_read()
281 m->count -= n; in seq_read()
282 m->from = n; in seq_read()
288 m->read_pos += copied; in seq_read()
290 file->f_version = m->version; in seq_read()
291 mutex_unlock(&m->lock); in seq_read()
312 struct seq_file *m = file->private_data; in seq_lseek() local
315 mutex_lock(&m->lock); in seq_lseek()
316 m->version = file->f_version; in seq_lseek()
325 if (offset != m->read_pos) { in seq_lseek()
326 while ((retval = traverse(m, offset)) == -EAGAIN) in seq_lseek()
331 m->read_pos = 0; in seq_lseek()
332 m->version = 0; in seq_lseek()
333 m->index = 0; in seq_lseek()
334 m->count = 0; in seq_lseek()
336 m->read_pos = offset; in seq_lseek()
343 file->f_version = m->version; in seq_lseek()
344 mutex_unlock(&m->lock); in seq_lseek()
359 struct seq_file *m = file->private_data; in seq_release() local
360 kvfree(m->buf); in seq_release()
361 kmem_cache_free(seq_file_cache, m); in seq_release()
376 void seq_escape(struct seq_file *m, const char *s, const char *esc) in seq_escape() argument
379 size_t size = seq_get_buf(m, &buf); in seq_escape()
383 seq_commit(m, ret < size ? ret : -1); in seq_escape()
387 void seq_escape_mem_ascii(struct seq_file *m, const char *src, size_t isz) in seq_escape_mem_ascii() argument
390 size_t size = seq_get_buf(m, &buf); in seq_escape_mem_ascii()
394 seq_commit(m, ret < size ? ret : -1); in seq_escape_mem_ascii()
398 void seq_vprintf(struct seq_file *m, const char *f, va_list args) in seq_vprintf() argument
402 if (m->count < m->size) { in seq_vprintf()
403 len = vsnprintf(m->buf + m->count, m->size - m->count, f, args); in seq_vprintf()
404 if (m->count + len < m->size) { in seq_vprintf()
405 m->count += len; in seq_vprintf()
409 seq_set_overflow(m); in seq_vprintf()
413 void seq_printf(struct seq_file *m, const char *f, ...) in seq_printf() argument
418 seq_vprintf(m, f, args); in seq_printf()
464 int seq_path(struct seq_file *m, const struct path *path, const char *esc) in seq_path() argument
467 size_t size = seq_get_buf(m, &buf); in seq_path()
478 seq_commit(m, res); in seq_path()
492 int seq_file_path(struct seq_file *m, struct file *file, const char *esc) in seq_file_path() argument
494 return seq_path(m, &file->f_path, esc); in seq_file_path()
501 int seq_path_root(struct seq_file *m, const struct path *path, in seq_path_root() argument
505 size_t size = seq_get_buf(m, &buf); in seq_path_root()
523 seq_commit(m, res); in seq_path_root()
531 int seq_dentry(struct seq_file *m, struct dentry *dentry, const char *esc) in seq_dentry() argument
534 size_t size = seq_get_buf(m, &buf); in seq_dentry()
545 seq_commit(m, res); in seq_dentry()
657 void seq_putc(struct seq_file *m, char c) in seq_putc() argument
659 if (m->count >= m->size) in seq_putc()
662 m->buf[m->count++] = c; in seq_putc()
666 void seq_puts(struct seq_file *m, const char *s) in seq_puts() argument
670 if (m->count + len >= m->size) { in seq_puts()
671 seq_set_overflow(m); in seq_puts()
674 memcpy(m->buf + m->count, s, len); in seq_puts()
675 m->count += len; in seq_puts()
691 void seq_put_decimal_ull_width(struct seq_file *m, const char *delimiter, in seq_put_decimal_ull_width() argument
696 if (m->count + 2 >= m->size) /* we'll write 2 bytes at least */ in seq_put_decimal_ull_width()
701 seq_putc(m, delimiter[0]); in seq_put_decimal_ull_width()
703 seq_puts(m, delimiter); in seq_put_decimal_ull_width()
709 if (m->count + width >= m->size) in seq_put_decimal_ull_width()
712 len = num_to_str(m->buf + m->count, m->size - m->count, num, width); in seq_put_decimal_ull_width()
716 m->count += len; in seq_put_decimal_ull_width()
720 seq_set_overflow(m); in seq_put_decimal_ull_width()
723 void seq_put_decimal_ull(struct seq_file *m, const char *delimiter, in seq_put_decimal_ull() argument
726 return seq_put_decimal_ull_width(m, delimiter, num, 0); in seq_put_decimal_ull()
742 void seq_put_hex_ll(struct seq_file *m, const char *delimiter, in seq_put_hex_ll() argument
750 seq_putc(m, delimiter[0]); in seq_put_hex_ll()
752 seq_puts(m, delimiter); in seq_put_hex_ll()
764 if (m->count + len > m->size) { in seq_put_hex_ll()
765 seq_set_overflow(m); in seq_put_hex_ll()
770 m->buf[m->count + i] = hex_asc[0xf & v]; in seq_put_hex_ll()
773 m->count += len; in seq_put_hex_ll()
776 void seq_put_decimal_ll(struct seq_file *m, const char *delimiter, long long num) in seq_put_decimal_ll() argument
780 if (m->count + 3 >= m->size) /* we'll write 2 bytes at least */ in seq_put_decimal_ll()
785 seq_putc(m, delimiter[0]); in seq_put_decimal_ll()
787 seq_puts(m, delimiter); in seq_put_decimal_ll()
790 if (m->count + 2 >= m->size) in seq_put_decimal_ll()
794 m->buf[m->count++] = '-'; in seq_put_decimal_ll()
799 m->buf[m->count++] = num + '0'; in seq_put_decimal_ll()
803 len = num_to_str(m->buf + m->count, m->size - m->count, num, 0); in seq_put_decimal_ll()
807 m->count += len; in seq_put_decimal_ll()
811 seq_set_overflow(m); in seq_put_decimal_ll()
840 void seq_pad(struct seq_file *m, char c) in seq_pad() argument
842 int size = m->pad_until - m->count; in seq_pad()
844 if (size + m->count > m->size) { in seq_pad()
845 seq_set_overflow(m); in seq_pad()
848 memset(m->buf + m->count, ' ', size); in seq_pad()
849 m->count += size; in seq_pad()
852 seq_putc(m, c); in seq_pad()
857 void seq_hex_dump(struct seq_file *m, const char *prefix_str, int prefix_type, in seq_hex_dump() argument
870 for (i = 0; i < len && !seq_has_overflowed(m); i += rowsize) { in seq_hex_dump()
876 seq_printf(m, "%s%p: ", prefix_str, ptr + i); in seq_hex_dump()
879 seq_printf(m, "%s%.8x: ", prefix_str, i); in seq_hex_dump()
882 seq_printf(m, "%s", prefix_str); in seq_hex_dump()
886 size = seq_get_buf(m, &buffer); in seq_hex_dump()
889 seq_commit(m, ret < size ? ret : -1); in seq_hex_dump()
891 seq_putc(m, '\n'); in seq_hex_dump()