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        WARN(next->prev != prev,
  24                "list_add corruption. next->prev should be "
  25                "prev (%p), but was %p. (next=%p).\n",
  26                prev, next->prev, next);
  27        WARN(prev->next != next,
  28                "list_add corruption. prev->next should be "
  29                "next (%p), but was %p. (prev=%p).\n",
  30                next, prev->next, prev);
  31        next->prev = new;
  32        new->next = next;
  33        new->prev = prev;
  34        prev->next = new;
  35}
  36EXPORT_SYMBOL(__list_add);
  37
  38void __list_del_entry(struct list_head *entry)
  39{
  40        struct list_head *prev, *next;
  41
  42        prev = entry->prev;
  43        next = entry->next;
  44
  45        if (WARN(next == LIST_POISON1,
  46                "list_del corruption, %p->next is LIST_POISON1 (%p)\n",
  47                entry, LIST_POISON1) ||
  48            WARN(prev == LIST_POISON2,
  49                "list_del corruption, %p->prev is LIST_POISON2 (%p)\n",
  50                entry, LIST_POISON2) ||
  51            WARN(prev->next != entry,
  52                "list_del corruption. prev->next should be %p, "
  53                "but was %p\n", entry, prev->next) ||
  54            WARN(next->prev != entry,
  55                "list_del corruption. next->prev should be %p, "
  56                "but was %p\n", entry, next->prev))
  57                return;
  58
  59        __list_del(prev, next);
  60}
  61EXPORT_SYMBOL(__list_del_entry);
  62
  63/**
  64 * list_del - deletes entry from list.
  65 * @entry: the element to delete from the list.
  66 * Note: list_empty on entry does not return true after this, the entry is
  67 * in an undefined state.
  68 */
  69void list_del(struct list_head *entry)
  70{
  71        __list_del_entry(entry);
  72        entry->next = LIST_POISON1;
  73        entry->prev = LIST_POISON2;
  74}
  75EXPORT_SYMBOL(list_del);
  76