Message ID | 4B6B780D.10003@cn.fujitsu.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Fri, 05 Feb 2010 09:44:45 +0800 Li Zefan <lizf@cn.fujitsu.com> wrote: > +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); > + > +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); > + > +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); Oy. Most of the global functions in seq_file.c are kerneldocumented, as they should be! Shouldn't seq_hlist_start_head() have been called seq_hlist_prev()? Should seq_hlist_start() be passed *ppos, and update *ppos so the caller can then call seq_hlist_next() and seq_hlist_prev()? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Andrew Morton wrote: > On Fri, 05 Feb 2010 09:44:45 +0800 Li Zefan <lizf@cn.fujitsu.com> wrote: > >> +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); >> + >> +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); >> + >> +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); > > Oy. Most of the global functions in seq_file.c are kerneldocumented, > as they should be! > I'll add kerneldoc in v2 patchset if I have to resend, otherwise I'll send a delta patch for this. > Shouldn't seq_hlist_start_head() have been called seq_hlist_prev()? > The list_head version has the name seq_list_start_head(). If you need to print a title in a seq_file, call seq_list_start_head() in ->start() handler, otherwise call seq_list_start(). Those functions really need kerneldoc. ;) > Should seq_hlist_start() be passed *ppos, and update *ppos so the > caller can then call seq_hlist_next() and seq_hlist_prev()? > No, the ->start() callback of seq_operations shouldn't update *ppos. I fixed some bugs in ftrace debugfs files which were caused by updating *ppos in start(). -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Li Zefan <lizf@cn.fujitsu.com> Date: Fri, 05 Feb 2010 10:12:56 +0800 > I'll add kerneldoc in v2 patchset if I have to resend, otherwise I'll > send a delta patch for this. I want you to, at a minimum, resend the first patch because you messed up the subject line for it. Thanks. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/seq_file.c b/fs/seq_file.c index eae7d9d..e833076 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) return NULL; } - EXPORT_SYMBOL(seq_list_start); 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); } - EXPORT_SYMBOL(seq_list_start_head); struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos) @@ -695,5 +693,38 @@ struct list_head *seq_list_next(void *v, struct list_head *head, loff_t *ppos) ++*ppos; return lh == head ? NULL : lh; } - EXPORT_SYMBOL(seq_list_next); + +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); + +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); + +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); + diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index 8366d8f..c95bcdc 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, extern struct list_head *seq_list_next(void *v, struct list_head *head, 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
[PATCH 01/13] 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> --- fs/seq_file.c | 37 ++++++++++++++++++++++++++++++++++--- include/linux/seq_file.h | 11 +++++++++++ 2 files changed, 45 insertions(+), 3 deletions(-)