Lines Matching +full:0 +full:m

28 static void seq_set_overflow(struct seq_file *m)  in seq_set_overflow()  argument
30 m->count = m->size; in seq_set_overflow()
52 * returns 0 in case of success and negative number in case of error.
86 return 0; in seq_open()
90 static int traverse(struct seq_file *m, loff_t offset) in traverse() argument
92 loff_t pos = 0; in traverse()
93 int error = 0; in traverse()
96 m->index = 0; in traverse()
97 m->count = m->from = 0; in traverse()
99 return 0; in traverse()
101 if (!m->buf) { in traverse()
102 m->buf = seq_buf_alloc(m->size = PAGE_SIZE); in traverse()
103 if (!m->buf) in traverse()
106 p = m->op->start(m, &m->index); in traverse()
111 error = m->op->show(m, p); in traverse()
112 if (error < 0) in traverse()
115 error = 0; in traverse()
116 m->count = 0; in traverse()
118 if (seq_has_overflowed(m)) in traverse()
120 p = m->op->next(m, p, &m->index); in traverse()
121 if (pos + m->count > offset) { in traverse()
122 m->from = offset - pos; in traverse()
123 m->count -= m->from; in traverse()
126 pos += m->count; in traverse()
127 m->count = 0; in traverse()
131 m->op->stop(m, p); in traverse()
135 m->op->stop(m, p); in traverse()
136 kvfree(m->buf); in traverse()
137 m->count = 0; in traverse()
138 m->buf = seq_buf_alloc(m->size <<= 1); in traverse()
139 return !m->buf ? -ENOMEM : -EAGAIN; in traverse()
173 struct seq_file *m = iocb->ki_filp->private_data; in seq_read_iter() local
174 size_t copied = 0; in seq_read_iter()
177 int err = 0; in seq_read_iter()
180 return 0; in seq_read_iter()
182 mutex_lock(&m->lock); in seq_read_iter()
188 if (iocb->ki_pos == 0) { in seq_read_iter()
189 m->index = 0; in seq_read_iter()
190 m->count = 0; in seq_read_iter()
194 if (unlikely(iocb->ki_pos != m->read_pos)) { in seq_read_iter()
195 while ((err = traverse(m, iocb->ki_pos)) == -EAGAIN) in seq_read_iter()
199 m->read_pos = 0; in seq_read_iter()
200 m->index = 0; in seq_read_iter()
201 m->count = 0; in seq_read_iter()
204 m->read_pos = iocb->ki_pos; in seq_read_iter()
209 if (!m->buf) { in seq_read_iter()
210 m->buf = seq_buf_alloc(m->size = PAGE_SIZE); in seq_read_iter()
211 if (!m->buf) in seq_read_iter()
215 if (m->count) { in seq_read_iter()
216 n = copy_to_iter(m->buf + m->from, m->count, iter); in seq_read_iter()
217 m->count -= n; in seq_read_iter()
218 m->from += n; in seq_read_iter()
220 if (m->count) // hadn't managed to copy everything in seq_read_iter()
224 m->from = 0; in seq_read_iter()
225 p = m->op->start(m, &m->index); in seq_read_iter()
230 err = m->op->show(m, p); in seq_read_iter()
231 if (err < 0) // hard error in seq_read_iter()
234 m->count = 0; in seq_read_iter()
235 if (unlikely(!m->count)) { // empty record in seq_read_iter()
236 p = m->op->next(m, p, &m->index); in seq_read_iter()
239 if (!seq_has_overflowed(m)) // got it in seq_read_iter()
242 m->op->stop(m, p); in seq_read_iter()
243 kvfree(m->buf); in seq_read_iter()
244 m->count = 0; in seq_read_iter()
245 m->buf = seq_buf_alloc(m->size <<= 1); in seq_read_iter()
246 if (!m->buf) in seq_read_iter()
248 p = m->op->start(m, &m->index); in seq_read_iter()
251 m->op->stop(m, p); in seq_read_iter()
252 m->count = 0; in seq_read_iter()
259 size_t offs = m->count; in seq_read_iter()
260 loff_t pos = m->index; in seq_read_iter()
262 p = m->op->next(m, p, &m->index); in seq_read_iter()
263 if (pos == m->index) { in seq_read_iter()
265 m->op->next); in seq_read_iter()
266 m->index++; in seq_read_iter()
270 if (m->count >= iov_iter_count(iter)) in seq_read_iter()
272 err = m->op->show(m, p); in seq_read_iter()
273 if (err > 0) { // ->show() says "skip it" in seq_read_iter()
274 m->count = offs; in seq_read_iter()
275 } else if (err || seq_has_overflowed(m)) { in seq_read_iter()
276 m->count = offs; in seq_read_iter()
280 m->op->stop(m, p); in seq_read_iter()
281 n = copy_to_iter(m->buf, m->count, iter); in seq_read_iter()
283 m->count -= n; in seq_read_iter()
284 m->from = n; in seq_read_iter()
287 copied = m->count ? -EFAULT : err; in seq_read_iter()
290 m->read_pos += copied; in seq_read_iter()
292 mutex_unlock(&m->lock); in seq_read_iter()
304 * @whence: 0 for absolute, 1 for relative position
310 struct seq_file *m = file->private_data; in seq_lseek() local
313 mutex_lock(&m->lock); in seq_lseek()
319 if (offset < 0) in seq_lseek()
322 if (offset != m->read_pos) { in seq_lseek()
323 while ((retval = traverse(m, offset)) == -EAGAIN) in seq_lseek()
327 file->f_pos = 0; in seq_lseek()
328 m->read_pos = 0; in seq_lseek()
329 m->index = 0; in seq_lseek()
330 m->count = 0; in seq_lseek()
332 m->read_pos = offset; in seq_lseek()
339 mutex_unlock(&m->lock); in seq_lseek()
354 struct seq_file *m = file->private_data; in seq_release() local
355 kvfree(m->buf); in seq_release()
356 kmem_cache_free(seq_file_cache, m); in seq_release()
357 return 0; in seq_release()
363 * @m: target buffer
374 void seq_escape_mem(struct seq_file *m, const char *src, size_t len, in seq_escape_mem() argument
378 size_t size = seq_get_buf(m, &buf); in seq_escape_mem()
382 seq_commit(m, ret < size ? ret : -1); in seq_escape_mem()
386 void seq_vprintf(struct seq_file *m, const char *f, va_list args) in seq_vprintf() argument
390 if (m->count < m->size) { in seq_vprintf()
391 len = vsnprintf(m->buf + m->count, m->size - m->count, f, args); in seq_vprintf()
392 if (m->count + len < m->size) { in seq_vprintf()
393 m->count += len; in seq_vprintf()
397 seq_set_overflow(m); in seq_vprintf()
401 void seq_printf(struct seq_file *m, const char *f, ...) in seq_printf() argument
406 seq_vprintf(m, f, args); in seq_printf()
412 void seq_bprintf(struct seq_file *m, const char *f, const u32 *binary) in seq_bprintf() argument
416 if (m->count < m->size) { in seq_bprintf()
417 len = bstr_printf(m->buf + m->count, m->size - m->count, f, in seq_bprintf()
419 if (m->count + len < m->size) { in seq_bprintf()
420 m->count += len; in seq_bprintf()
424 seq_set_overflow(m); in seq_bprintf()
452 *s++ = '0' + ((c & 0300) >> 6); in mangle_path()
453 *s++ = '0' + ((c & 070) >> 3); in mangle_path()
454 *s++ = '0' + (c & 07); in mangle_path()
463 * @m: the seq_file handle
470 int seq_path(struct seq_file *m, const struct path *path, const char *esc) in seq_path() argument
473 size_t size = seq_get_buf(m, &buf); in seq_path()
484 seq_commit(m, res); in seq_path()
492 * @m: the seq_file handle
498 int seq_file_path(struct seq_file *m, struct file *file, const char *esc) in seq_file_path() argument
500 return seq_path(m, &file->f_path, esc); in seq_file_path()
507 int seq_path_root(struct seq_file *m, const struct path *path, in seq_path_root() argument
511 size_t size = seq_get_buf(m, &buf); in seq_path_root()
529 seq_commit(m, res); in seq_path_root()
531 return res < 0 && res != -ENAMETOOLONG ? res : 0; in seq_path_root()
537 int seq_dentry(struct seq_file *m, struct dentry *dentry, const char *esc) in seq_dentry() argument
540 size_t size = seq_get_buf(m, &buf); in seq_dentry()
551 seq_commit(m, res); in seq_dentry()
607 return 0; in single_open_size()
642 if (rc < 0) in __seq_open_private()
659 return __seq_open_private(filp, ops, psize) ? 0 : -ENOMEM; in seq_open_private()
663 void seq_putc(struct seq_file *m, char c) in seq_putc() argument
665 if (m->count >= m->size) in seq_putc()
668 m->buf[m->count++] = c; in seq_putc()
672 void __seq_puts(struct seq_file *m, const char *s) in __seq_puts() argument
674 seq_write(m, s, strlen(s)); in __seq_puts()
682 * @m: seq_file identifying the buffer to which data should be written
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()
699 if (delimiter && delimiter[0]) { in seq_put_decimal_ull_width()
700 if (delimiter[1] == 0) 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()
732 * @m: seq_file identifying the buffer to which data should be written
737 * seq_put_hex_ll(m, "", v, 8) is equal to seq_printf(m, "%08llx", v)
742 void seq_put_hex_ll(struct seq_file *m, const char *delimiter, in seq_put_hex_ll() argument
748 if (delimiter && delimiter[0]) { in seq_put_hex_ll()
749 if (delimiter[1] == 0) in seq_put_hex_ll()
750 seq_putc(m, delimiter[0]); in seq_put_hex_ll()
752 seq_puts(m, delimiter); in seq_put_hex_ll()
755 /* If x is 0, the result of __builtin_clzll is undefined */ in seq_put_hex_ll()
756 if (v == 0) 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()
769 for (i = len - 1; i >= 0; i--) { 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()
783 if (delimiter && delimiter[0]) { in seq_put_decimal_ll()
784 if (delimiter[1] == 0) 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()
793 if (num < 0) { 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()
821 * Return 0 on success, non-zero otherwise.
828 return 0; in seq_write()
837 * @m: seq_file identifying the buffer to which data should be written
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()
843 if (size > 0) { 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()
901 if (pos-- == 0) in seq_list_start()
932 if (pos-- == 0) in seq_list_start_rcu()
971 if (pos-- == 0) in seq_hlist_start()
1032 if (pos-- == 0) in seq_hlist_start_rcu()
1101 if (pos-- == 0) in seq_hlist_start_percpu()