On Mon, 4 Aug 2008 15:48:09 -0700 Luis R. Rodriguez wrote: > This adds list_cut_position() which lets you cut a list into > two lists given a pivot in the list. > > Signed-off-by: Luis R. Rodriguez <lrodriguez@xxxxxxxxxxx> > --- > include/linux/list.h | 32 ++++++++++++++++++++++++++++++++ > 1 files changed, 32 insertions(+), 0 deletions(-) > > diff --git a/include/linux/list.h b/include/linux/list.h > index 594f67c..2999b0f 100644 > --- a/include/linux/list.h > +++ b/include/linux/list.h > @@ -214,6 +214,38 @@ static inline int list_is_singular(const struct list_head *head) > return !list_empty(head) && (head->next == head->prev); > } > > +static inline void __list_cut_position(struct list_head *list, > + struct list_head *head, struct list_head *entry) > +{ > + struct list_head *new_first = > + (entry->next != head) ? entry->next : head; > + list->next = head->next; > + list->next->prev = list; > + list->prev = entry; > + entry->next = list; > + head->next = new_first; > + new_first->prev = head; > +} > + > +/** > + * list_cut_position - cut a list into two > + * @list: a new list to add all removed entries > + * @head: a list with entries > + * @entry: an entry within head, could be the head itself > + * and if so we won't won't cut the list drop one "won't" > + */ > +static inline void list_cut_position(struct list_head *list, > + struct list_head *head, struct list_head *entry) > +{ > + BUG_ON(list_empty(head)); > + if (list_is_singular(head)) > + BUG_ON(head->next != entry && head != entry); > + if (entry == head) > + INIT_LIST_HEAD(list); > + else > + __list_cut_position(list, head, entry); > +} > + > static inline void __list_splice(const struct list_head *list, > struct list_head *head) > { --- ~Randy Linux Plumbers Conference, 17-19 September 2008, Portland, Oregon USA http://linuxplumbersconf.org/ -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html