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>
This commit is contained in:
parent
b1109bf085
commit
66655de6d1
2 changed files with 67 additions and 3 deletions
|
@ -674,7 +674,6 @@ struct list_head *seq_list_start(struct list_head *head, loff_t pos)
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(seq_list_start);
|
EXPORT_SYMBOL(seq_list_start);
|
||||||
|
|
||||||
struct list_head *seq_list_start_head(struct list_head *head, loff_t pos)
|
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)
|
||||||
|
|
||||||
return seq_list_start(head, pos - 1);
|
return seq_list_start(head, pos - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(seq_list_start_head);
|
EXPORT_SYMBOL(seq_list_start_head);
|
||||||
|
|
||||||
struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos)
|
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)
|
||||||
++*ppos;
|
++*ppos;
|
||||||
return lh == head ? NULL : lh;
|
return lh == head ? NULL : lh;
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL(seq_list_next);
|
EXPORT_SYMBOL(seq_list_next);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* seq_hlist_start - start an iteration of a hlist
|
||||||
|
* @head: the head of the hlist
|
||||||
|
* @pos: the start position of the sequence
|
||||||
|
*
|
||||||
|
* Called at seq_file->op->start().
|
||||||
|
*/
|
||||||
|
struct hlist_node *seq_hlist_start(struct hlist_head *head, loff_t pos)
|
||||||
|
{
|
||||||
|
struct hlist_node *node;
|
||||||
|
|
||||||
|
hlist_for_each(node, head)
|
||||||
|
if (pos-- == 0)
|
||||||
|
return node;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(seq_hlist_start);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* seq_hlist_start_head - start an iteration of a hlist
|
||||||
|
* @head: the head of the hlist
|
||||||
|
* @pos: the start position of the sequence
|
||||||
|
*
|
||||||
|
* Called at seq_file->op->start(). Call this function if you want to
|
||||||
|
* print a header at the top of the output.
|
||||||
|
*/
|
||||||
|
struct hlist_node *seq_hlist_start_head(struct hlist_head *head, loff_t pos)
|
||||||
|
{
|
||||||
|
if (!pos)
|
||||||
|
return SEQ_START_TOKEN;
|
||||||
|
|
||||||
|
return seq_hlist_start(head, pos - 1);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(seq_hlist_start_head);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* seq_hlist_next - move to the next position of the hlist
|
||||||
|
* @v: the current iterator
|
||||||
|
* @head: the head of the hlist
|
||||||
|
* @pos: the current posision
|
||||||
|
*
|
||||||
|
* Called at seq_file->op->next().
|
||||||
|
*/
|
||||||
|
struct hlist_node *seq_hlist_next(void *v, struct hlist_head *head,
|
||||||
|
loff_t *ppos)
|
||||||
|
{
|
||||||
|
struct hlist_node *node = v;
|
||||||
|
|
||||||
|
++*ppos;
|
||||||
|
if (v == SEQ_START_TOKEN)
|
||||||
|
return head->first;
|
||||||
|
else
|
||||||
|
return node->next;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(seq_hlist_next);
|
||||||
|
|
|
@ -135,4 +135,15 @@ extern struct list_head *seq_list_start_head(struct list_head *head,
|
||||||
extern struct list_head *seq_list_next(void *v, struct list_head *head,
|
extern struct list_head *seq_list_next(void *v, struct list_head *head,
|
||||||
loff_t *ppos);
|
loff_t *ppos);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Helpers for iteration over hlist_head-s in seq_files
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern struct hlist_node *seq_hlist_start(struct hlist_head *head,
|
||||||
|
loff_t pos);
|
||||||
|
extern struct hlist_node *seq_hlist_start_head(struct hlist_head *head,
|
||||||
|
loff_t pos);
|
||||||
|
extern struct hlist_node *seq_hlist_next(void *v, struct hlist_head *head,
|
||||||
|
loff_t *ppos);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue