|
@@ -215,21 +215,21 @@ static inline int list_is_singular(const struct list_head *head)
|
|
}
|
|
}
|
|
|
|
|
|
static inline void __list_splice(const struct list_head *list,
|
|
static inline void __list_splice(const struct list_head *list,
|
|
- struct list_head *head)
|
|
|
|
|
|
+ struct list_head *prev,
|
|
|
|
+ struct list_head *next)
|
|
{
|
|
{
|
|
struct list_head *first = list->next;
|
|
struct list_head *first = list->next;
|
|
struct list_head *last = list->prev;
|
|
struct list_head *last = list->prev;
|
|
- struct list_head *at = head->next;
|
|
|
|
|
|
|
|
- first->prev = head;
|
|
|
|
- head->next = first;
|
|
|
|
|
|
+ first->prev = prev;
|
|
|
|
+ prev->next = first;
|
|
|
|
|
|
- last->next = at;
|
|
|
|
- at->prev = last;
|
|
|
|
|
|
+ last->next = next;
|
|
|
|
+ next->prev = last;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * list_splice - join two lists
|
|
|
|
|
|
+ * list_splice - join two lists, this is designed for stacks
|
|
* @list: the new list to add.
|
|
* @list: the new list to add.
|
|
* @head: the place to add it in the first list.
|
|
* @head: the place to add it in the first list.
|
|
*/
|
|
*/
|
|
@@ -237,7 +237,19 @@ static inline void list_splice(const struct list_head *list,
|
|
struct list_head *head)
|
|
struct list_head *head)
|
|
{
|
|
{
|
|
if (!list_empty(list))
|
|
if (!list_empty(list))
|
|
- __list_splice(list, head);
|
|
|
|
|
|
+ __list_splice(list, head, head->next);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * list_splice_tail - join two lists, each list being a queue
|
|
|
|
+ * @list: the new list to add.
|
|
|
|
+ * @head: the place to add it in the first list.
|
|
|
|
+ */
|
|
|
|
+static inline void list_splice_tail(struct list_head *list,
|
|
|
|
+ struct list_head *head)
|
|
|
|
+{
|
|
|
|
+ if (!list_empty(list))
|
|
|
|
+ __list_splice(list, head->prev, head);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -251,7 +263,24 @@ static inline void list_splice_init(struct list_head *list,
|
|
struct list_head *head)
|
|
struct list_head *head)
|
|
{
|
|
{
|
|
if (!list_empty(list)) {
|
|
if (!list_empty(list)) {
|
|
- __list_splice(list, head);
|
|
|
|
|
|
+ __list_splice(list, head, head->next);
|
|
|
|
+ INIT_LIST_HEAD(list);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * list_splice_tail_init - join two lists, each list being a queue, and
|
|
|
|
+ * reinitialise the emptied list.
|
|
|
|
+ * @list: the new list to add.
|
|
|
|
+ * @head: the place to add it in the first list.
|
|
|
|
+ *
|
|
|
|
+ * The list at @list is reinitialised
|
|
|
|
+ */
|
|
|
|
+static inline void list_splice_tail_init(struct list_head *list,
|
|
|
|
+ struct list_head *head)
|
|
|
|
+{
|
|
|
|
+ if (!list_empty(list)) {
|
|
|
|
+ __list_splice(list, head->prev, head);
|
|
INIT_LIST_HEAD(list);
|
|
INIT_LIST_HEAD(list);
|
|
}
|
|
}
|
|
}
|
|
}
|