Blame view

lib/list_debug.c 1.96 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
23
  /*
   * 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)
  {
  	if (unlikely(next->prev != prev)) {
8f63fdbbd   Dave Jones   [PATCH] More list...
24
25
26
27
  		printk(KERN_ERR "list_add corruption. next->prev should be "
  			"prev (%p), but was %p. (next=%p).
  ",
  			prev, next->prev, next);
199a9afc3   Dave Jones   [PATCH] Debug var...
28
29
30
  		BUG();
  	}
  	if (unlikely(prev->next != next)) {
8f63fdbbd   Dave Jones   [PATCH] More list...
31
32
33
34
  		printk(KERN_ERR "list_add corruption. prev->next should be "
  			"next (%p), but was %p. (prev=%p).
  ",
  			next, prev->next, prev);
199a9afc3   Dave Jones   [PATCH] Debug var...
35
36
37
38
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
  		BUG();
  	}
  	next->prev = new;
  	new->next = next;
  	new->prev = prev;
  	prev->next = new;
  }
  EXPORT_SYMBOL(__list_add);
  
  /**
   * list_add - add a new entry
   * @new: new entry to be added
   * @head: list head to add it after
   *
   * Insert a new entry after the specified head.
   * This is good for implementing stacks.
   */
  void list_add(struct list_head *new, struct list_head *head)
  {
  	__list_add(new, head, head->next);
  }
  EXPORT_SYMBOL(list_add);
  
  /**
   * 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)
  {
  	if (unlikely(entry->prev->next != entry)) {
df89a8646   Manfred Spraul   [PATCH] list_del ...
67
68
69
  		printk(KERN_ERR "list_del corruption. prev->next should be %p, "
  				"but was %p
  ", entry, entry->prev->next);
199a9afc3   Dave Jones   [PATCH] Debug var...
70
71
72
  		BUG();
  	}
  	if (unlikely(entry->next->prev != entry)) {
df89a8646   Manfred Spraul   [PATCH] list_del ...
73
74
75
  		printk(KERN_ERR "list_del corruption. next->prev should be %p, "
  				"but was %p
  ", entry, entry->next->prev);
199a9afc3   Dave Jones   [PATCH] Debug var...
76
77
78
79
80
81
82
  		BUG();
  	}
  	__list_del(entry->prev, entry->next);
  	entry->next = LIST_POISON1;
  	entry->prev = LIST_POISON2;
  }
  EXPORT_SYMBOL(list_del);