xref: /openbmc/linux/fs/seq_file.c (revision ca79522c)
1 /*
2  * linux/fs/seq_file.c
3  *
4  * helper functions for making synthetic files from sequences of records.
5  * initial implementation -- AV, Oct 2001.
6  */
7 
8 #include <linux/fs.h>
9 #include <linux/export.h>
10 #include <linux/seq_file.h>
11 #include <linux/slab.h>
12 #include <linux/cred.h>
13 
14 #include <asm/uaccess.h>
15 #include <asm/page.h>
16 
17 
18 /*
19  * seq_files have a buffer which can may overflow. When this happens a larger
20  * buffer is reallocated and all the data will be printed again.
21  * The overflow state is true when m->count == m->size.
22  */
23 static bool seq_overflow(struct seq_file *m)
24 {
25 	return m->count == m->size;
26 }
27 
28 static void seq_set_overflow(struct seq_file *m)
29 {
30 	m->count = m->size;
31 }
32 
33 /**
34  *	seq_open -	initialize sequential file
35  *	@file: file we initialize
36  *	@op: method table describing the sequence
37  *
38  *	seq_open() sets @file, associating it with a sequence described
39  *	by @op.  @op->start() sets the iterator up and returns the first
40  *	element of sequence. @op->stop() shuts it down.  @op->next()
41  *	returns the next element of sequence.  @op->show() prints element
42  *	into the buffer.  In case of error ->start() and ->next() return
43  *	ERR_PTR(error).  In the end of sequence they return %NULL. ->show()
44  *	returns 0 in case of success and negative number in case of error.
45  *	Returning SEQ_SKIP means "discard this element and move on".
46  */
47 int seq_open(struct file *file, const struct seq_operations *op)
48 {
49 	struct seq_file *p = file->private_data;
50 
51 	if (!p) {
52 		p = kmalloc(sizeof(*p), GFP_KERNEL);
53 		if (!p)
54 			return -ENOMEM;
55 		file->private_data = p;
56 	}
57 	memset(p, 0, sizeof(*p));
58 	mutex_init(&p->lock);
59 	p->op = op;
60 #ifdef CONFIG_USER_NS
61 	p->user_ns = file->f_cred->user_ns;
62 #endif
63 
64 	/*
65 	 * Wrappers around seq_open(e.g. swaps_open) need to be
66 	 * aware of this. If they set f_version themselves, they
67 	 * should call seq_open first and then set f_version.
68 	 */
69 	file->f_version = 0;
70 
71 	/*
72 	 * seq_files support lseek() and pread().  They do not implement
73 	 * write() at all, but we clear FMODE_PWRITE here for historical
74 	 * reasons.
75 	 *
76 	 * If a client of seq_files a) implements file.write() and b) wishes to
77 	 * support pwrite() then that client will need to implement its own
78 	 * file.open() which calls seq_open() and then sets FMODE_PWRITE.
79 	 */
80 	file->f_mode &= ~FMODE_PWRITE;
81 	return 0;
82 }
83 EXPORT_SYMBOL(seq_open);
84 
85 static int traverse(struct seq_file *m, loff_t offset)
86 {
87 	loff_t pos = 0, index;
88 	int error = 0;
89 	void *p;
90 
91 	m->version = 0;
92 	index = 0;
93 	m->count = m->from = 0;
94 	if (!offset) {
95 		m->index = index;
96 		return 0;
97 	}
98 	if (!m->buf) {
99 		m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
100 		if (!m->buf)
101 			return -ENOMEM;
102 	}
103 	p = m->op->start(m, &index);
104 	while (p) {
105 		error = PTR_ERR(p);
106 		if (IS_ERR(p))
107 			break;
108 		error = m->op->show(m, p);
109 		if (error < 0)
110 			break;
111 		if (unlikely(error)) {
112 			error = 0;
113 			m->count = 0;
114 		}
115 		if (seq_overflow(m))
116 			goto Eoverflow;
117 		if (pos + m->count > offset) {
118 			m->from = offset - pos;
119 			m->count -= m->from;
120 			m->index = index;
121 			break;
122 		}
123 		pos += m->count;
124 		m->count = 0;
125 		if (pos == offset) {
126 			index++;
127 			m->index = index;
128 			break;
129 		}
130 		p = m->op->next(m, p, &index);
131 	}
132 	m->op->stop(m, p);
133 	m->index = index;
134 	return error;
135 
136 Eoverflow:
137 	m->op->stop(m, p);
138 	kfree(m->buf);
139 	m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
140 	return !m->buf ? -ENOMEM : -EAGAIN;
141 }
142 
143 /**
144  *	seq_read -	->read() method for sequential files.
145  *	@file: the file to read from
146  *	@buf: the buffer to read to
147  *	@size: the maximum number of bytes to read
148  *	@ppos: the current position in the file
149  *
150  *	Ready-made ->f_op->read()
151  */
152 ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
153 {
154 	struct seq_file *m = file->private_data;
155 	size_t copied = 0;
156 	loff_t pos;
157 	size_t n;
158 	void *p;
159 	int err = 0;
160 
161 	mutex_lock(&m->lock);
162 
163 	/*
164 	 * seq_file->op->..m_start/m_stop/m_next may do special actions
165 	 * or optimisations based on the file->f_version, so we want to
166 	 * pass the file->f_version to those methods.
167 	 *
168 	 * seq_file->version is just copy of f_version, and seq_file
169 	 * methods can treat it simply as file version.
170 	 * It is copied in first and copied out after all operations.
171 	 * It is convenient to have it as  part of structure to avoid the
172 	 * need of passing another argument to all the seq_file methods.
173 	 */
174 	m->version = file->f_version;
175 
176 	/* Don't assume *ppos is where we left it */
177 	if (unlikely(*ppos != m->read_pos)) {
178 		while ((err = traverse(m, *ppos)) == -EAGAIN)
179 			;
180 		if (err) {
181 			/* With prejudice... */
182 			m->read_pos = 0;
183 			m->version = 0;
184 			m->index = 0;
185 			m->count = 0;
186 			goto Done;
187 		} else {
188 			m->read_pos = *ppos;
189 		}
190 	}
191 
192 	/* grab buffer if we didn't have one */
193 	if (!m->buf) {
194 		m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
195 		if (!m->buf)
196 			goto Enomem;
197 	}
198 	/* if not empty - flush it first */
199 	if (m->count) {
200 		n = min(m->count, size);
201 		err = copy_to_user(buf, m->buf + m->from, n);
202 		if (err)
203 			goto Efault;
204 		m->count -= n;
205 		m->from += n;
206 		size -= n;
207 		buf += n;
208 		copied += n;
209 		if (!m->count)
210 			m->index++;
211 		if (!size)
212 			goto Done;
213 	}
214 	/* we need at least one record in buffer */
215 	pos = m->index;
216 	p = m->op->start(m, &pos);
217 	while (1) {
218 		err = PTR_ERR(p);
219 		if (!p || IS_ERR(p))
220 			break;
221 		err = m->op->show(m, p);
222 		if (err < 0)
223 			break;
224 		if (unlikely(err))
225 			m->count = 0;
226 		if (unlikely(!m->count)) {
227 			p = m->op->next(m, p, &pos);
228 			m->index = pos;
229 			continue;
230 		}
231 		if (m->count < m->size)
232 			goto Fill;
233 		m->op->stop(m, p);
234 		kfree(m->buf);
235 		m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
236 		if (!m->buf)
237 			goto Enomem;
238 		m->count = 0;
239 		m->version = 0;
240 		pos = m->index;
241 		p = m->op->start(m, &pos);
242 	}
243 	m->op->stop(m, p);
244 	m->count = 0;
245 	goto Done;
246 Fill:
247 	/* they want more? let's try to get some more */
248 	while (m->count < size) {
249 		size_t offs = m->count;
250 		loff_t next = pos;
251 		p = m->op->next(m, p, &next);
252 		if (!p || IS_ERR(p)) {
253 			err = PTR_ERR(p);
254 			break;
255 		}
256 		err = m->op->show(m, p);
257 		if (seq_overflow(m) || err) {
258 			m->count = offs;
259 			if (likely(err <= 0))
260 				break;
261 		}
262 		pos = next;
263 	}
264 	m->op->stop(m, p);
265 	n = min(m->count, size);
266 	err = copy_to_user(buf, m->buf, n);
267 	if (err)
268 		goto Efault;
269 	copied += n;
270 	m->count -= n;
271 	if (m->count)
272 		m->from = n;
273 	else
274 		pos++;
275 	m->index = pos;
276 Done:
277 	if (!copied)
278 		copied = err;
279 	else {
280 		*ppos += copied;
281 		m->read_pos += copied;
282 	}
283 	file->f_version = m->version;
284 	mutex_unlock(&m->lock);
285 	return copied;
286 Enomem:
287 	err = -ENOMEM;
288 	goto Done;
289 Efault:
290 	err = -EFAULT;
291 	goto Done;
292 }
293 EXPORT_SYMBOL(seq_read);
294 
295 /**
296  *	seq_lseek -	->llseek() method for sequential files.
297  *	@file: the file in question
298  *	@offset: new position
299  *	@whence: 0 for absolute, 1 for relative position
300  *
301  *	Ready-made ->f_op->llseek()
302  */
303 loff_t seq_lseek(struct file *file, loff_t offset, int whence)
304 {
305 	struct seq_file *m = file->private_data;
306 	loff_t retval = -EINVAL;
307 
308 	mutex_lock(&m->lock);
309 	m->version = file->f_version;
310 	switch (whence) {
311 	case SEEK_CUR:
312 		offset += file->f_pos;
313 	case SEEK_SET:
314 		if (offset < 0)
315 			break;
316 		retval = offset;
317 		if (offset != m->read_pos) {
318 			while ((retval = traverse(m, offset)) == -EAGAIN)
319 				;
320 			if (retval) {
321 				/* with extreme prejudice... */
322 				file->f_pos = 0;
323 				m->read_pos = 0;
324 				m->version = 0;
325 				m->index = 0;
326 				m->count = 0;
327 			} else {
328 				m->read_pos = offset;
329 				retval = file->f_pos = offset;
330 			}
331 		}
332 	}
333 	file->f_version = m->version;
334 	mutex_unlock(&m->lock);
335 	return retval;
336 }
337 EXPORT_SYMBOL(seq_lseek);
338 
339 /**
340  *	seq_release -	free the structures associated with sequential file.
341  *	@file: file in question
342  *	@inode: its inode
343  *
344  *	Frees the structures associated with sequential file; can be used
345  *	as ->f_op->release() if you don't have private data to destroy.
346  */
347 int seq_release(struct inode *inode, struct file *file)
348 {
349 	struct seq_file *m = file->private_data;
350 	kfree(m->buf);
351 	kfree(m);
352 	return 0;
353 }
354 EXPORT_SYMBOL(seq_release);
355 
356 /**
357  *	seq_escape -	print string into buffer, escaping some characters
358  *	@m:	target buffer
359  *	@s:	string
360  *	@esc:	set of characters that need escaping
361  *
362  *	Puts string into buffer, replacing each occurrence of character from
363  *	@esc with usual octal escape.  Returns 0 in case of success, -1 - in
364  *	case of overflow.
365  */
366 int seq_escape(struct seq_file *m, const char *s, const char *esc)
367 {
368 	char *end = m->buf + m->size;
369         char *p;
370 	char c;
371 
372         for (p = m->buf + m->count; (c = *s) != '\0' && p < end; s++) {
373 		if (!strchr(esc, c)) {
374 			*p++ = c;
375 			continue;
376 		}
377 		if (p + 3 < end) {
378 			*p++ = '\\';
379 			*p++ = '0' + ((c & 0300) >> 6);
380 			*p++ = '0' + ((c & 070) >> 3);
381 			*p++ = '0' + (c & 07);
382 			continue;
383 		}
384 		seq_set_overflow(m);
385 		return -1;
386         }
387 	m->count = p - m->buf;
388         return 0;
389 }
390 EXPORT_SYMBOL(seq_escape);
391 
392 int seq_vprintf(struct seq_file *m, const char *f, va_list args)
393 {
394 	int len;
395 
396 	if (m->count < m->size) {
397 		len = vsnprintf(m->buf + m->count, m->size - m->count, f, args);
398 		if (m->count + len < m->size) {
399 			m->count += len;
400 			return 0;
401 		}
402 	}
403 	seq_set_overflow(m);
404 	return -1;
405 }
406 EXPORT_SYMBOL(seq_vprintf);
407 
408 int seq_printf(struct seq_file *m, const char *f, ...)
409 {
410 	int ret;
411 	va_list args;
412 
413 	va_start(args, f);
414 	ret = seq_vprintf(m, f, args);
415 	va_end(args);
416 
417 	return ret;
418 }
419 EXPORT_SYMBOL(seq_printf);
420 
421 /**
422  *	mangle_path -	mangle and copy path to buffer beginning
423  *	@s: buffer start
424  *	@p: beginning of path in above buffer
425  *	@esc: set of characters that need escaping
426  *
427  *      Copy the path from @p to @s, replacing each occurrence of character from
428  *      @esc with usual octal escape.
429  *      Returns pointer past last written character in @s, or NULL in case of
430  *      failure.
431  */
432 char *mangle_path(char *s, const char *p, const char *esc)
433 {
434 	while (s <= p) {
435 		char c = *p++;
436 		if (!c) {
437 			return s;
438 		} else if (!strchr(esc, c)) {
439 			*s++ = c;
440 		} else if (s + 4 > p) {
441 			break;
442 		} else {
443 			*s++ = '\\';
444 			*s++ = '0' + ((c & 0300) >> 6);
445 			*s++ = '0' + ((c & 070) >> 3);
446 			*s++ = '0' + (c & 07);
447 		}
448 	}
449 	return NULL;
450 }
451 EXPORT_SYMBOL(mangle_path);
452 
453 /**
454  * seq_path - seq_file interface to print a pathname
455  * @m: the seq_file handle
456  * @path: the struct path to print
457  * @esc: set of characters to escape in the output
458  *
459  * return the absolute path of 'path', as represented by the
460  * dentry / mnt pair in the path parameter.
461  */
462 int seq_path(struct seq_file *m, const struct path *path, const char *esc)
463 {
464 	char *buf;
465 	size_t size = seq_get_buf(m, &buf);
466 	int res = -1;
467 
468 	if (size) {
469 		char *p = d_path(path, buf, size);
470 		if (!IS_ERR(p)) {
471 			char *end = mangle_path(buf, p, esc);
472 			if (end)
473 				res = end - buf;
474 		}
475 	}
476 	seq_commit(m, res);
477 
478 	return res;
479 }
480 EXPORT_SYMBOL(seq_path);
481 
482 /*
483  * Same as seq_path, but relative to supplied root.
484  */
485 int seq_path_root(struct seq_file *m, const struct path *path,
486 		  const struct path *root, const char *esc)
487 {
488 	char *buf;
489 	size_t size = seq_get_buf(m, &buf);
490 	int res = -ENAMETOOLONG;
491 
492 	if (size) {
493 		char *p;
494 
495 		p = __d_path(path, root, buf, size);
496 		if (!p)
497 			return SEQ_SKIP;
498 		res = PTR_ERR(p);
499 		if (!IS_ERR(p)) {
500 			char *end = mangle_path(buf, p, esc);
501 			if (end)
502 				res = end - buf;
503 			else
504 				res = -ENAMETOOLONG;
505 		}
506 	}
507 	seq_commit(m, res);
508 
509 	return res < 0 && res != -ENAMETOOLONG ? res : 0;
510 }
511 
512 /*
513  * returns the path of the 'dentry' from the root of its filesystem.
514  */
515 int seq_dentry(struct seq_file *m, struct dentry *dentry, const char *esc)
516 {
517 	char *buf;
518 	size_t size = seq_get_buf(m, &buf);
519 	int res = -1;
520 
521 	if (size) {
522 		char *p = dentry_path(dentry, buf, size);
523 		if (!IS_ERR(p)) {
524 			char *end = mangle_path(buf, p, esc);
525 			if (end)
526 				res = end - buf;
527 		}
528 	}
529 	seq_commit(m, res);
530 
531 	return res;
532 }
533 
534 int seq_bitmap(struct seq_file *m, const unsigned long *bits,
535 				   unsigned int nr_bits)
536 {
537 	if (m->count < m->size) {
538 		int len = bitmap_scnprintf(m->buf + m->count,
539 				m->size - m->count, bits, nr_bits);
540 		if (m->count + len < m->size) {
541 			m->count += len;
542 			return 0;
543 		}
544 	}
545 	seq_set_overflow(m);
546 	return -1;
547 }
548 EXPORT_SYMBOL(seq_bitmap);
549 
550 int seq_bitmap_list(struct seq_file *m, const unsigned long *bits,
551 		unsigned int nr_bits)
552 {
553 	if (m->count < m->size) {
554 		int len = bitmap_scnlistprintf(m->buf + m->count,
555 				m->size - m->count, bits, nr_bits);
556 		if (m->count + len < m->size) {
557 			m->count += len;
558 			return 0;
559 		}
560 	}
561 	seq_set_overflow(m);
562 	return -1;
563 }
564 EXPORT_SYMBOL(seq_bitmap_list);
565 
566 static void *single_start(struct seq_file *p, loff_t *pos)
567 {
568 	return NULL + (*pos == 0);
569 }
570 
571 static void *single_next(struct seq_file *p, void *v, loff_t *pos)
572 {
573 	++*pos;
574 	return NULL;
575 }
576 
577 static void single_stop(struct seq_file *p, void *v)
578 {
579 }
580 
581 int single_open(struct file *file, int (*show)(struct seq_file *, void *),
582 		void *data)
583 {
584 	struct seq_operations *op = kmalloc(sizeof(*op), GFP_KERNEL);
585 	int res = -ENOMEM;
586 
587 	if (op) {
588 		op->start = single_start;
589 		op->next = single_next;
590 		op->stop = single_stop;
591 		op->show = show;
592 		res = seq_open(file, op);
593 		if (!res)
594 			((struct seq_file *)file->private_data)->private = data;
595 		else
596 			kfree(op);
597 	}
598 	return res;
599 }
600 EXPORT_SYMBOL(single_open);
601 
602 int single_open_size(struct file *file, int (*show)(struct seq_file *, void *),
603 		void *data, size_t size)
604 {
605 	char *buf = kmalloc(size, GFP_KERNEL);
606 	int ret;
607 	if (!buf)
608 		return -ENOMEM;
609 	ret = single_open(file, show, data);
610 	if (ret) {
611 		kfree(buf);
612 		return ret;
613 	}
614 	((struct seq_file *)file->private_data)->buf = buf;
615 	((struct seq_file *)file->private_data)->size = size;
616 	return 0;
617 }
618 EXPORT_SYMBOL(single_open_size);
619 
620 int single_release(struct inode *inode, struct file *file)
621 {
622 	const struct seq_operations *op = ((struct seq_file *)file->private_data)->op;
623 	int res = seq_release(inode, file);
624 	kfree(op);
625 	return res;
626 }
627 EXPORT_SYMBOL(single_release);
628 
629 int seq_release_private(struct inode *inode, struct file *file)
630 {
631 	struct seq_file *seq = file->private_data;
632 
633 	kfree(seq->private);
634 	seq->private = NULL;
635 	return seq_release(inode, file);
636 }
637 EXPORT_SYMBOL(seq_release_private);
638 
639 void *__seq_open_private(struct file *f, const struct seq_operations *ops,
640 		int psize)
641 {
642 	int rc;
643 	void *private;
644 	struct seq_file *seq;
645 
646 	private = kzalloc(psize, GFP_KERNEL);
647 	if (private == NULL)
648 		goto out;
649 
650 	rc = seq_open(f, ops);
651 	if (rc < 0)
652 		goto out_free;
653 
654 	seq = f->private_data;
655 	seq->private = private;
656 	return private;
657 
658 out_free:
659 	kfree(private);
660 out:
661 	return NULL;
662 }
663 EXPORT_SYMBOL(__seq_open_private);
664 
665 int seq_open_private(struct file *filp, const struct seq_operations *ops,
666 		int psize)
667 {
668 	return __seq_open_private(filp, ops, psize) ? 0 : -ENOMEM;
669 }
670 EXPORT_SYMBOL(seq_open_private);
671 
672 int seq_putc(struct seq_file *m, char c)
673 {
674 	if (m->count < m->size) {
675 		m->buf[m->count++] = c;
676 		return 0;
677 	}
678 	return -1;
679 }
680 EXPORT_SYMBOL(seq_putc);
681 
682 int seq_puts(struct seq_file *m, const char *s)
683 {
684 	int len = strlen(s);
685 	if (m->count + len < m->size) {
686 		memcpy(m->buf + m->count, s, len);
687 		m->count += len;
688 		return 0;
689 	}
690 	seq_set_overflow(m);
691 	return -1;
692 }
693 EXPORT_SYMBOL(seq_puts);
694 
695 /*
696  * A helper routine for putting decimal numbers without rich format of printf().
697  * only 'unsigned long long' is supported.
698  * This routine will put one byte delimiter + number into seq_file.
699  * This routine is very quick when you show lots of numbers.
700  * In usual cases, it will be better to use seq_printf(). It's easier to read.
701  */
702 int seq_put_decimal_ull(struct seq_file *m, char delimiter,
703 			unsigned long long num)
704 {
705 	int len;
706 
707 	if (m->count + 2 >= m->size) /* we'll write 2 bytes at least */
708 		goto overflow;
709 
710 	if (delimiter)
711 		m->buf[m->count++] = delimiter;
712 
713 	if (num < 10) {
714 		m->buf[m->count++] = num + '0';
715 		return 0;
716 	}
717 
718 	len = num_to_str(m->buf + m->count, m->size - m->count, num);
719 	if (!len)
720 		goto overflow;
721 	m->count += len;
722 	return 0;
723 overflow:
724 	seq_set_overflow(m);
725 	return -1;
726 }
727 EXPORT_SYMBOL(seq_put_decimal_ull);
728 
729 int seq_put_decimal_ll(struct seq_file *m, char delimiter,
730 			long long num)
731 {
732 	if (num < 0) {
733 		if (m->count + 3 >= m->size) {
734 			seq_set_overflow(m);
735 			return -1;
736 		}
737 		if (delimiter)
738 			m->buf[m->count++] = delimiter;
739 		num = -num;
740 		delimiter = '-';
741 	}
742 	return seq_put_decimal_ull(m, delimiter, num);
743 
744 }
745 EXPORT_SYMBOL(seq_put_decimal_ll);
746 
747 /**
748  * seq_write - write arbitrary data to buffer
749  * @seq: seq_file identifying the buffer to which data should be written
750  * @data: data address
751  * @len: number of bytes
752  *
753  * Return 0 on success, non-zero otherwise.
754  */
755 int seq_write(struct seq_file *seq, const void *data, size_t len)
756 {
757 	if (seq->count + len < seq->size) {
758 		memcpy(seq->buf + seq->count, data, len);
759 		seq->count += len;
760 		return 0;
761 	}
762 	seq_set_overflow(seq);
763 	return -1;
764 }
765 EXPORT_SYMBOL(seq_write);
766 
767 struct list_head *seq_list_start(struct list_head *head, loff_t pos)
768 {
769 	struct list_head *lh;
770 
771 	list_for_each(lh, head)
772 		if (pos-- == 0)
773 			return lh;
774 
775 	return NULL;
776 }
777 EXPORT_SYMBOL(seq_list_start);
778 
779 struct list_head *seq_list_start_head(struct list_head *head, loff_t pos)
780 {
781 	if (!pos)
782 		return head;
783 
784 	return seq_list_start(head, pos - 1);
785 }
786 EXPORT_SYMBOL(seq_list_start_head);
787 
788 struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos)
789 {
790 	struct list_head *lh;
791 
792 	lh = ((struct list_head *)v)->next;
793 	++*ppos;
794 	return lh == head ? NULL : lh;
795 }
796 EXPORT_SYMBOL(seq_list_next);
797 
798 /**
799  * seq_hlist_start - start an iteration of a hlist
800  * @head: the head of the hlist
801  * @pos:  the start position of the sequence
802  *
803  * Called at seq_file->op->start().
804  */
805 struct hlist_node *seq_hlist_start(struct hlist_head *head, loff_t pos)
806 {
807 	struct hlist_node *node;
808 
809 	hlist_for_each(node, head)
810 		if (pos-- == 0)
811 			return node;
812 	return NULL;
813 }
814 EXPORT_SYMBOL(seq_hlist_start);
815 
816 /**
817  * seq_hlist_start_head - start an iteration of a hlist
818  * @head: the head of the hlist
819  * @pos:  the start position of the sequence
820  *
821  * Called at seq_file->op->start(). Call this function if you want to
822  * print a header at the top of the output.
823  */
824 struct hlist_node *seq_hlist_start_head(struct hlist_head *head, loff_t pos)
825 {
826 	if (!pos)
827 		return SEQ_START_TOKEN;
828 
829 	return seq_hlist_start(head, pos - 1);
830 }
831 EXPORT_SYMBOL(seq_hlist_start_head);
832 
833 /**
834  * seq_hlist_next - move to the next position of the hlist
835  * @v:    the current iterator
836  * @head: the head of the hlist
837  * @ppos: the current position
838  *
839  * Called at seq_file->op->next().
840  */
841 struct hlist_node *seq_hlist_next(void *v, struct hlist_head *head,
842 				  loff_t *ppos)
843 {
844 	struct hlist_node *node = v;
845 
846 	++*ppos;
847 	if (v == SEQ_START_TOKEN)
848 		return head->first;
849 	else
850 		return node->next;
851 }
852 EXPORT_SYMBOL(seq_hlist_next);
853 
854 /**
855  * seq_hlist_start_rcu - start an iteration of a hlist protected by RCU
856  * @head: the head of the hlist
857  * @pos:  the start position of the sequence
858  *
859  * Called at seq_file->op->start().
860  *
861  * This list-traversal primitive may safely run concurrently with
862  * the _rcu list-mutation primitives such as hlist_add_head_rcu()
863  * as long as the traversal is guarded by rcu_read_lock().
864  */
865 struct hlist_node *seq_hlist_start_rcu(struct hlist_head *head,
866 				       loff_t pos)
867 {
868 	struct hlist_node *node;
869 
870 	__hlist_for_each_rcu(node, head)
871 		if (pos-- == 0)
872 			return node;
873 	return NULL;
874 }
875 EXPORT_SYMBOL(seq_hlist_start_rcu);
876 
877 /**
878  * seq_hlist_start_head_rcu - start an iteration of a hlist protected by RCU
879  * @head: the head of the hlist
880  * @pos:  the start position of the sequence
881  *
882  * Called at seq_file->op->start(). Call this function if you want to
883  * print a header at the top of the output.
884  *
885  * This list-traversal primitive may safely run concurrently with
886  * the _rcu list-mutation primitives such as hlist_add_head_rcu()
887  * as long as the traversal is guarded by rcu_read_lock().
888  */
889 struct hlist_node *seq_hlist_start_head_rcu(struct hlist_head *head,
890 					    loff_t pos)
891 {
892 	if (!pos)
893 		return SEQ_START_TOKEN;
894 
895 	return seq_hlist_start_rcu(head, pos - 1);
896 }
897 EXPORT_SYMBOL(seq_hlist_start_head_rcu);
898 
899 /**
900  * seq_hlist_next_rcu - move to the next position of the hlist protected by RCU
901  * @v:    the current iterator
902  * @head: the head of the hlist
903  * @ppos: the current position
904  *
905  * Called at seq_file->op->next().
906  *
907  * This list-traversal primitive may safely run concurrently with
908  * the _rcu list-mutation primitives such as hlist_add_head_rcu()
909  * as long as the traversal is guarded by rcu_read_lock().
910  */
911 struct hlist_node *seq_hlist_next_rcu(void *v,
912 				      struct hlist_head *head,
913 				      loff_t *ppos)
914 {
915 	struct hlist_node *node = v;
916 
917 	++*ppos;
918 	if (v == SEQ_START_TOKEN)
919 		return rcu_dereference(head->first);
920 	else
921 		return rcu_dereference(node->next);
922 }
923 EXPORT_SYMBOL(seq_hlist_next_rcu);
924