Blame view

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