* [PATCH 2/4] list.h: add list_cut_position()
@ 2008-08-04 22:48 Luis R. Rodriguez
2008-08-04 23:00 ` Randy Dunlap
0 siblings, 1 reply; 9+ messages in thread
From: Luis R. Rodriguez @ 2008-08-04 22:48 UTC (permalink / raw)
To: linville, netdev, linux-kernel, linville, torvalds
Cc: Luis R. Rodriguez, linux-wireless, ath9k-devel
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@atheros.com>
---
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
+ */
+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)
{
--
1.5.6.rc2.15.g457bb.dirty
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] list.h: add list_cut_position()
2008-08-04 22:48 [PATCH 2/4] list.h: add list_cut_position() Luis R. Rodriguez
@ 2008-08-04 23:00 ` Randy Dunlap
[not found] ` <20080804160011.ec964f1f.randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 9+ messages in thread
From: Randy Dunlap @ 2008-08-04 23:00 UTC (permalink / raw)
To: Luis R. Rodriguez
Cc: linville, netdev, linux-kernel, torvalds, linux-wireless,
ath9k-devel
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@atheros.com>
> ---
> 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/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] list.h: add list_cut_position()
[not found] ` <20080804160011.ec964f1f.randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
@ 2008-08-04 23:13 ` Luis R. Rodriguez
2008-08-05 8:52 ` Jochen Voß
0 siblings, 1 reply; 9+ messages in thread
From: Luis R. Rodriguez @ 2008-08-04 23:13 UTC (permalink / raw)
To: Randy Dunlap
Cc: Luis Rodriguez, linville-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org,
netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org,
linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
ath9k-devel-juf53994utBLZpfksSYvnA@public.gmane.org
On Mon, Aug 04, 2008 at 04:00:11PM -0700, Randy Dunlap wrote:
> 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-DlyHzToyqoxBDgjK7y7TUQ@public.gmane.org>
> > ---
> > 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"
Thanks.
---
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 cut the list
+ */
+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)
{
--
1.5.6.rc2.15.g457bb.dirty
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] list.h: add list_cut_position()
2008-08-04 23:13 ` Luis R. Rodriguez
@ 2008-08-05 8:52 ` Jochen Voß
2008-08-06 18:27 ` Luis R. Rodriguez
0 siblings, 1 reply; 9+ messages in thread
From: Jochen Voß @ 2008-08-05 8:52 UTC (permalink / raw)
To: Luis R. Rodriguez
Cc: Randy Dunlap, Luis Rodriguez, linville@tuxdriver.com,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
torvalds@linux-foundation.org, linux-wireless@vger.kernel.org,
ath9k-devel@venema.h4ckr.net
Hi,
2008/8/5 Luis R. Rodriguez <lrodriguez@atheros.com>:
> +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;
Isn't this just an over-complicated way of writing "new_first = entry->next"?
> + 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 cut the list
> + */
I think it would be helpful if the comment explained what the function
actually does, i.e. that it moves the inital part of 'head' (up to and
including 'entry' from 'head' to 'list'.
> +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);
No other list function in "list.h" has BUG_ONs. Why this one?
> + if (entry == head)
> + INIT_LIST_HEAD(list);
If there was data in 'list' before the call, it will be lost now. Is
this intended behaviour?
> + else
> + __list_cut_position(list, head, entry);
> +}
> +
I hope this helps,
Jochen
--
http://seehuhn.de/
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] list.h: add list_cut_position()
2008-08-05 8:52 ` Jochen Voß
@ 2008-08-06 18:27 ` Luis R. Rodriguez
2008-08-06 18:35 ` Randy Dunlap
0 siblings, 1 reply; 9+ messages in thread
From: Luis R. Rodriguez @ 2008-08-06 18:27 UTC (permalink / raw)
To: Jochen Voß
Cc: Luis Rodriguez, Randy Dunlap, linville@tuxdriver.com,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
torvalds@linux-foundation.org, linux-wireless@vger.kernel.org,
ath9k-devel@venema.h4ckr.net
On Tue, Aug 05, 2008 at 01:52:22AM -0700, Jochen Voß wrote:
> Hi,
>
> 2008/8/5 Luis R. Rodriguez <lrodriguez@atheros.com>:
> > +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;
>
> Isn't this just an over-complicated way of writing "new_first = entry->next"?
Sorry, yes.
> > + 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 cut the list
> > + */
>
> I think it would be helpful if the comment explained what the function
> actually does, i.e. that it moves the inital part of 'head' (up to and
> including 'entry' from 'head' to 'list'.
Will do.
> > +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);
>
> No other list function in "list.h" has BUG_ONs. Why this one?
Alright, I'll just make some small note on the documentation and exit early
on these.
> > + if (entry == head)
> > + INIT_LIST_HEAD(list);
>
> If there was data in 'list' before the call, it will be lost now. Is
> this intended behaviour?
Yes, the user of this call should not care if we wipe @list for them as
it is just a reference. This lets you, for example, use @list on
list_cut_position() it in a loop. I'll extend the documentation to
clarify this.
> > + else
> > + __list_cut_position(list, head, entry);
> > +}
> > +
>
> I hope this helps,
It certainly has, thanks for reviewing. How's this:
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@atheros.com>
diff --git a/include/linux/list.h b/include/linux/list.h
index 453916b..6c02a83 100644
--- a/include/linux/list.h
+++ b/include/linux/list.h
@@ -214,6 +214,46 @@ 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;
+ 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
+ *
+ * This helper moves the initial part of @head, up to and
+ * including @entry, from @head to @list. You should
+ * pass on @entry an element you know is on @head. @list
+ * should be an empty list or a list you do not care about
+ * losing its data.
+ *
+ * @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 cut the list
+ */
+static inline void list_cut_position(struct list_head *list,
+ struct list_head *head, struct list_head *entry)
+{
+ if (list_empty(head))
+ return;
+ if (list_is_singular(head) &&
+ (head->next != entry && head != entry))
+ return;
+ 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)
{
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] list.h: add list_cut_position()
2008-08-06 18:27 ` Luis R. Rodriguez
@ 2008-08-06 18:35 ` Randy Dunlap
2008-08-06 18:45 ` Luis R. Rodriguez
0 siblings, 1 reply; 9+ messages in thread
From: Randy Dunlap @ 2008-08-06 18:35 UTC (permalink / raw)
To: Jochen Voß, Luis R. Rodriguez
Cc: ath9k-devel@venema.h4ckr.net, netdev@vger.kernel.org,
linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org,
linville@tuxdriver.com, Luis Rodriguez,
torvalds@linux-foundation.org
> 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@atheros.com>
>
> diff --git a/include/linux/list.h b/include/linux/list.h
> index 453916b..6c02a83 100644
> --- a/include/linux/list.h
> +++ b/include/linux/list.h
> @@ -214,6 +214,46 @@ 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;
> + 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
> + *
> + * This helper moves the initial part of @head, up to and
> + * including @entry, from @head to @list. You should
> + * pass on @entry an element you know is on @head. @list
> + * should be an empty list or a list you do not care about
> + * losing its data.
> + *
> + * @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 cut the list
> + */
For kernel-doc notation, the parameters need to follow the function name+short description.
After that, a longer description can be added. I.e., please move the parameters up to
above the longer description...
> +static inline void list_cut_position(struct list_head *list,
> + struct list_head *head, struct list_head *entry)
> +{
> + if (list_empty(head))
> + return;
> + if (list_is_singular(head) &&
> + (head->next != entry && head != entry))
> + return;
> + 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)
> {
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] list.h: add list_cut_position()
2008-08-06 18:35 ` Randy Dunlap
@ 2008-08-06 18:45 ` Luis R. Rodriguez
2008-08-06 20:28 ` Luis R. Rodriguez
0 siblings, 1 reply; 9+ messages in thread
From: Luis R. Rodriguez @ 2008-08-06 18:45 UTC (permalink / raw)
To: Randy Dunlap
Cc: ath9k-devel@venema.h4ckr.net, Jochen Voß,
netdev@vger.kernel.org, linux-wireless@vger.kernel.org,
linux-kernel@vger.kernel.org, linville@tuxdriver.com,
Luis Rodriguez, torvalds@linux-foundation.org
On Wed, Aug 06, 2008 at 11:35:54AM -0700, Randy Dunlap 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@atheros.com>
> >
> > diff --git a/include/linux/list.h b/include/linux/list.h
> > index 453916b..6c02a83 100644
> > --- a/include/linux/list.h
> > +++ b/include/linux/list.h
> > @@ -214,6 +214,46 @@ 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;
> > + 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
> > + *
> > + * This helper moves the initial part of @head, up to and
> > + * including @entry, from @head to @list. You should
> > + * pass on @entry an element you know is on @head. @list
> > + * should be an empty list or a list you do not care about
> > + * losing its data.
> > + *
> > + * @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 cut the list
> > + */
>
> For kernel-doc notation, the parameters need to follow the function name+short description.
> After that, a longer description can be added. I.e., please move the parameters up to
> above the longer description...
Bleh, sorry, we need to fix some more kdoc in mac80211 too then.
OK here's the new one.
--
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@atheros.com>
diff --git a/include/linux/list.h b/include/linux/list.h
index 453916b..3b0ac8c 100644
--- a/include/linux/list.h
+++ b/include/linux/list.h
@@ -214,6 +214,46 @@ 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;
+ 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 cut the list
+ *
+ * This helper moves the initial part of @head, up to and
+ * including @entry, from @head to @list. You should
+ * pass on @entry an element you know is on @head. @list
+ * should be an empty list or a list you do not care about
+ * losing its data.
+ *
+ */
+static inline void list_cut_position(struct list_head *list,
+ struct list_head *head, struct list_head *entry)
+{
+ if (list_empty(head))
+ return;
+ if (list_is_singular(head) &&
+ (head->next != entry && head != entry))
+ return;
+ 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)
{
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] list.h: add list_cut_position()
2008-08-06 18:45 ` Luis R. Rodriguez
@ 2008-08-06 20:28 ` Luis R. Rodriguez
2008-08-06 20:32 ` Luis R. Rodriguez
0 siblings, 1 reply; 9+ messages in thread
From: Luis R. Rodriguez @ 2008-08-06 20:28 UTC (permalink / raw)
To: Luis Rodriguez
Cc: Randy Dunlap, ath9k-devel@venema.h4ckr.net, Jochen Voß,
netdev@vger.kernel.org, linux-wireless@vger.kernel.org,
linux-kernel@vger.kernel.org, linville@tuxdriver.com,
torvalds@linux-foundation.org, Peter Zijlstra
On Wed, Aug 06, 2008 at 11:45:20AM -0700, Luis Rodriguez wrote:
>
> OK here's the new one.
> --
>
> 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@atheros.com>
Here it is again but this time one which applies cleanly ontop of the
list_cut_tail() patch I just reposted.
--
list.h: add list_cut_position()
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@atheros.com>
---
include/linux/list.h | 40 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/include/linux/list.h b/include/linux/list.h
index 61034a6..78e5f1c 100644
--- a/include/linux/list.h
+++ b/include/linux/list.h
@@ -214,6 +214,46 @@ 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;
+ 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 cut the list
+ *
+ * This helper moves the initial part of @head, up to and
+ * including @entry, from @head to @list. You should
+ * pass on @entry an element you know is on @head. @list
+ * should be an empty list or a list you do not care about
+ * losing its data.
+ *
+ */
+static inline void list_cut_position(struct list_head *list,
+ struct list_head *head, struct list_head *entry)
+{
+ if (list_empty(head))
+ return;
+ if (list_is_singular(head) &&
+ (head->next != entry && head != entry))
+ return;
+ 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 *prev,
struct list_head *next)
--
1.5.6.rc2.15.g457bb.dirty
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] list.h: add list_cut_position()
2008-08-06 20:28 ` Luis R. Rodriguez
@ 2008-08-06 20:32 ` Luis R. Rodriguez
0 siblings, 0 replies; 9+ messages in thread
From: Luis R. Rodriguez @ 2008-08-06 20:32 UTC (permalink / raw)
To: Luis Rodriguez
Cc: Randy Dunlap, Jochen Voß,
netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org,
ath9k-devel-juf53994utBLZpfksSYvnA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linville-2XuSBdqkA4R54TAoqtyWWQ@public.gmane.org,
linux-wireless-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Peter Zijlstra
On Wed, Aug 06, 2008 at 01:28:54PM -0700, Luis Rodriguez wrote:
> On Wed, Aug 06, 2008 at 11:45:20AM -0700, Luis Rodriguez wrote:
> >
> > OK here's the new one.
> > --
> >
> > 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-DlyHzToyqoxBDgjK7y7TUQ@public.gmane.org>
>
> Here it is again but this time one which applies cleanly ontop of the
> list_cut_tail() patch I just reposted.
I meant on top of the list_splice_tail() of course :)
Luis
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-08-06 20:32 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-04 22:48 [PATCH 2/4] list.h: add list_cut_position() Luis R. Rodriguez
2008-08-04 23:00 ` Randy Dunlap
[not found] ` <20080804160011.ec964f1f.randy.dunlap-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>
2008-08-04 23:13 ` Luis R. Rodriguez
2008-08-05 8:52 ` Jochen Voß
2008-08-06 18:27 ` Luis R. Rodriguez
2008-08-06 18:35 ` Randy Dunlap
2008-08-06 18:45 ` Luis R. Rodriguez
2008-08-06 20:28 ` Luis R. Rodriguez
2008-08-06 20:32 ` Luis R. Rodriguez
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).