2
* Copyright (C) 2004-2008 Heinz Mauelshagen, Red Hat GmbH.
5
* Copyright (C) 2007 Intel Corporation. All rights reserved.
6
* November, 2007 - additions for Create, Delete, Rebuild & Raid 10.
8
* See file LICENSE at the top of this source tree for license information.
15
* Double-linked list definitons and macros.
19
struct list_head *next;
20
struct list_head *prev;
23
#define INIT_LIST_HEAD(a) do { (a)->next = (a)->prev = a; } while(0)
25
#define LIST_HEAD(a) struct list_head a = { .next = &a, .prev = &a }
27
#define list_empty(pos) ((pos)->next == pos)
30
__list_add(struct list_head *new,
31
struct list_head *prev, struct list_head *next)
39
/* Add an element 'new' after position 'pos' to a list. */
40
#define list_add(new, pos) __list_add(new, pos, (pos)->next)
42
/* Add an element 'new' before position 'pos' to a list. */
43
#define list_add_tail(new, pos) __list_add(new, (pos)->prev, pos)
45
/* Delete an element 'pos' from the list. */
46
#define list_del(pos) { \
47
(pos)->next->prev = (pos)->prev; \
48
(pos)->prev->next = (pos)->next; \
49
(pos)->next = (pos)->prev = 0; \
52
#define list_del_init(pos) { \
54
INIT_LIST_HEAD(pos); \
57
/* Pointer to a struct 'type' derived from 'pos' and list_head* 'member'. */
58
#define list_entry(pos, type, member) \
59
((type*) ((char*)pos - (unsigned long)(&((type*)0)->member)))
62
#define list_for_each(pos, head) \
63
for (pos = (head)->next; pos != head; pos = pos->next)
65
/* Walk a list by entry. */
66
#define list_for_each_entry(entry, head, member) \
67
for (entry = list_entry((head)->next, typeof(*entry), member); \
68
&entry->member != (head); \
69
entry = list_entry(entry->member.next, typeof(*entry), member))
72
* Walk a list using a temporary pointer,
73
* so that elements can be deleted safely.
75
#define list_for_each_safe(pos, n, head) \
76
for (pos = (head)->next, n = pos->next; \
78
pos = n, n = pos->next)
80
#define list_for_each_entry_safe(pos, n, head, member) \
81
for (pos = list_entry((head)->next, typeof(*pos), member),\
82
n = list_entry(pos->member.next, typeof(*pos), member); \
83
&pos->member != (head); \
84
pos = n, n = list_entry(pos->member.next, typeof(*pos), member))