| 1 | |
| 2 | * Copyright 2006, Red Hat, Inc., Dave Jones
|
| 3 | * Released under the General Public License (GPL).
|
| 4 | *
|
| 5 | * This file contains the linked list implementations for
|
| 6 | * DEBUG_LIST.
|
| 7 |
|
| 8 |
|
| 9 | #include <linux/module.h>
|
| 10 | #include <linux/list.h>
|
| 11 |
|
| 12 | |
| 13 | * Insert a new entry between two known consecutive entries.
|
| 14 | *
|
| 15 | * This is only for internal list manipulation where we know
|
| 16 | * the prev/next entries already!
|
| 17 |
|
| 18 |
|
| 19 | void __list_add(struct list_head *new,
|
| 20 | struct list_head *prev,
|
| 21 | struct list_head *next)
|
| 22 | {
|
| 23 | if (unlikely(next->prev != prev)) {
|
| 24 | printk(KERN_ERR "list_add corruption. next->prev should be "
|
| 25 | "prev (%p), but was %p. (next=%p).\n",
|
| 26 | prev, next->prev, next);
|
| 27 | BUG();
|
| 28 | }
|
| 29 | if (unlikely(prev->next != next)) {
|
| 30 | printk(KERN_ERR "list_add corruption. prev->next should be "
|
| 31 | "next (%p), but was %p. (prev=%p).\n",
|
| 32 | next, prev->next, prev);
|
| 33 | BUG();
|
| 34 | }
|
| 35 | next->prev = new;
|
| 36 | new->next = next;
|
| 37 | new->prev = prev;
|
| 38 | prev->next = new;
|
| 39 | }
|
| 40 | EXPORT_SYMBOL(__list_add);
|
| 41 |
|
| 42 | |
| 43 | * list_add - add a new entry
|
| 44 | * @new: new entry to be added
|
| 45 | * @head: list head to add it after
|
| 46 | *
|
| 47 | * Insert a new entry after the specified head.
|
| 48 | * This is good for implementing stacks.
|
| 49 |
|
| 50 | void list_add(struct list_head *new, struct list_head *head)
|
| 51 | {
|
| 52 | __list_add(new, head, head->next);
|
| 53 | }
|
| 54 | EXPORT_SYMBOL(list_add);
|
| 55 |
|
| 56 | |
| 57 | * list_del - deletes entry from list.
|
| 58 | * @entry: the element to delete from the list.
|
| 59 | * Note: list_empty on entry does not return true after this, the entry is
|
| 60 | * in an undefined state.
|
| 61 |
|
| 62 | void list_del(struct list_head *entry)
|
| 63 | {
|
| 64 | if (unlikely(entry->prev->next != entry)) {
|
| 65 | printk(KERN_ERR "list_del corruption. prev->next should be %p, "
|
| 66 | "but was %p\n", entry, entry->prev->next);
|
| 67 | BUG();
|
| 68 | }
|
| 69 | if (unlikely(entry->next->prev != entry)) {
|
| 70 | printk(KERN_ERR "list_del corruption. next->prev should be %p, "
|
| 71 | "but was %p\n", entry, entry->next->prev);
|
| 72 | BUG();
|
| 73 | }
|
| 74 | __list_del(entry->prev, entry->next);
|
| 75 | entry->next = LIST_POISON1;
|
| 76 | entry->prev = LIST_POISON2;
|
| 77 | }
|
| 78 | EXPORT_SYMBOL(list_del);
|