xref: /linux/lib/list_debug.c (revision 99b5aa3c10c7cff1e97239fda93649222fc12d25)
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);
79