diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2010-02-08 18:18:22 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-10 14:12:06 -0500 |
commit | 66655de6d132b726be64c324bc3f9ea366d20697 (patch) | |
tree | d88c42a19de245e4a81337eef6bf06555586005d | |
parent | b1109bf085c8dd69537b7876ea83f914dd1fe46a (diff) |
seq_file: Add helpers for iteration over a hlist
Some places in kernel need to iterate over a hlist in seq_file,
so provide some common helpers.
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | fs/seq_file.c | 59 | ||||
-rw-r--r-- | include/linux/seq_file.h | 11 |
2 files changed, 67 insertions, 3 deletions
diff --git a/fs/seq_file.c b/fs/seq_file.c index eae7d9dbf3ff..f65b16f02da3 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c | |||
@@ -674,7 +674,6 @@ struct list_head *seq_list_start(struct list_head *head, loff_t pos) | |||
674 | 674 | ||
675 | return NULL; | 675 | return NULL; |
676 | } | 676 | } |
677 | |||
678 | EXPORT_SYMBOL(seq_list_start); | 677 | EXPORT_SYMBOL(seq_list_start); |
679 | 678 | ||
680 | struct list_head *seq_list_start_head(struct list_head *head, loff_t pos) | 679 | struct list_head *seq_list_start_head(struct list_head *head, loff_t pos) |
@@ -684,7 +683,6 @@ struct list_head *seq_list_start_head(struct list_head *head, loff_t pos) | |||
684 | 683 | ||
685 | return seq_list_start(head, pos - 1); | 684 | return seq_list_start(head, pos - 1); |
686 | } | 685 | } |
687 | |||
688 | EXPORT_SYMBOL(seq_list_start_head); | 686 | EXPORT_SYMBOL(seq_list_start_head); |
689 | 687 | ||
690 | struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos) | 688 | struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos) |
@@ -695,5 +693,60 @@ struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos) | |||
695 | ++*ppos; | 693 | ++*ppos; |
696 | return lh == head ? NULL : lh; | 694 | return lh == head ? NULL : lh; |
697 | } | 695 | } |
698 | |||
699 | EXPORT_SYMBOL(seq_list_next); | 696 | EXPORT_SYMBOL(seq_list_next); |
697 | |||
698 | /** | ||
699 | * seq_hlist_start - start an iteration of a hlist | ||
700 | * @head: the head of the hlist | ||
701 | * @pos: the start position of the sequence | ||
702 | * | ||
703 | * Called at seq_file->op->start(). | ||
704 | */ | ||
705 | struct hlist_node *seq_hlist_start(struct hlist_head *head, loff_t pos) | ||
706 | { | ||
707 | struct hlist_node *node; | ||
708 | |||
709 | hlist_for_each(node, head) | ||
710 | if (pos-- == 0) | ||
711 | return node; | ||
712 | return NULL; | ||
713 | } | ||
714 | EXPORT_SYMBOL(seq_hlist_start); | ||
715 | |||
716 | /** | ||
717 | * seq_hlist_start_head - start an iteration of a hlist | ||
718 | * @head: the head of the hlist | ||
719 | * @pos: the start position of the sequence | ||
720 | * | ||
721 | * Called at seq_file->op->start(). Call this function if you want to | ||
722 | * print a header at the top of the output. | ||
723 | */ | ||
724 | struct hlist_node *seq_hlist_start_head(struct hlist_head *head, loff_t pos) | ||
725 | { | ||
726 | if (!pos) | ||
727 | return SEQ_START_TOKEN; | ||
728 | |||
729 | return seq_hlist_start(head, pos - 1); | ||
730 | } | ||
731 | EXPORT_SYMBOL(seq_hlist_start_head); | ||
732 | |||
733 | /** | ||
734 | * seq_hlist_next - move to the next position of the hlist | ||
735 | * @v: the current iterator | ||
736 | * @head: the head of the hlist | ||
737 | * @pos: the current posision | ||
738 | * | ||
739 | * Called at seq_file->op->next(). | ||
740 | */ | ||
741 | struct hlist_node *seq_hlist_next(void *v, struct hlist_head *head, | ||
742 | loff_t *ppos) | ||
743 | { | ||
744 | struct hlist_node *node = v; | ||
745 | |||
746 | ++*ppos; | ||
747 | if (v == SEQ_START_TOKEN) | ||
748 | return head->first; | ||
749 | else | ||
750 | return node->next; | ||
751 | } | ||
752 | EXPORT_SYMBOL(seq_hlist_next); | ||
diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 8366d8f12e53..c95bcdc18f4c 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h | |||
@@ -135,4 +135,15 @@ extern struct list_head *seq_list_start_head(struct list_head *head, | |||
135 | extern struct list_head *seq_list_next(void *v, struct list_head *head, | 135 | extern struct list_head *seq_list_next(void *v, struct list_head *head, |
136 | loff_t *ppos); | 136 | loff_t *ppos); |
137 | 137 | ||
138 | /* | ||
139 | * Helpers for iteration over hlist_head-s in seq_files | ||
140 | */ | ||
141 | |||
142 | extern struct hlist_node *seq_hlist_start(struct hlist_head *head, | ||
143 | loff_t pos); | ||
144 | extern struct hlist_node *seq_hlist_start_head(struct hlist_head *head, | ||
145 | loff_t pos); | ||
146 | extern struct hlist_node *seq_hlist_next(void *v, struct hlist_head *head, | ||
147 | loff_t *ppos); | ||
148 | |||
138 | #endif | 149 | #endif |