Blame view

lib/list_debug.c 1.72 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
39
40
  	next->prev = new;
  	new->next = next;
  	new->prev = prev;
  	prev->next = new;
  }
  EXPORT_SYMBOL(__list_add);
  
  /**
199a9afc3   Dave Jones   [PATCH] Debug var...
41
42
43
44
45
46
47
   * 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)
  {
e3f76e338   Baruch Siach   list debugging: w...
48
49
50
51
52
53
54
55
  	WARN(entry->next == LIST_POISON1,
  		"list_del corruption, next is LIST_POISON1 (%p)
  ",
  		LIST_POISON1);
  	WARN(entry->next != LIST_POISON1 && entry->prev == LIST_POISON2,
  		"list_del corruption, prev is LIST_POISON2 (%p)
  ",
  		LIST_POISON2);
924d9addb   Dave Jones   list debugging: u...
56
57
58
59
60
61
62
63
  	WARN(entry->prev->next != entry,
  		"list_del corruption. prev->next should be %p, "
  		"but was %p
  ", entry, entry->prev->next);
  	WARN(entry->next->prev != entry,
  		"list_del corruption. next->prev should be %p, "
  		"but was %p
  ", entry, entry->next->prev);
199a9afc3   Dave Jones   [PATCH] Debug var...
64
65
66
67
68
  	__list_del(entry->prev, entry->next);
  	entry->next = LIST_POISON1;
  	entry->prev = LIST_POISON2;
  }
  EXPORT_SYMBOL(list_del);