linux/lib/list_debug.c
<<
>>
Prefs
   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
  19void __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}
  40EXPORT_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 */
  50void list_add(struct list_head *new, struct list_head *head)
  51{
  52        __list_add(new, head, head->next);
  53}
  54EXPORT_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 */
  62void 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}
  78EXPORT_SYMBOL(list_del);
  79