~psusi/ubuntu/precise/dmraid/fix-gpt

« back to all changes in this revision

Viewing changes to 1.0.0.rc15/include/dmraid/list.h

  • Committer: Bazaar Package Importer
  • Author(s): Giuseppe Iuculano, 6af052c
  • Date: 2009-03-25 22:34:59 UTC
  • mfrom: (2.1.9 sid)
  • mto: (2.4.1 squeeze)
  • mto: This revision was merged to the branch mainline in revision 39.
  • Revision ID: james.westby@ubuntu.com-20090325223459-y54f0rmxem7htn6r
Tags: 1.0.0.rc15-6
[6af052c] Remove 15_isw_incorrect_status_fix.patch, it causes a
segfault. (Closes: #521104)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2004-2008  Heinz Mauelshagen, Red Hat GmbH.
 
3
 *                          All rights reserved.
 
4
 *
 
5
 * Copyright (C) 2007   Intel Corporation. All rights reserved.
 
6
 * November, 2007 - additions for Create, Delete, Rebuild & Raid 10. 
 
7
 * 
 
8
 * See file LICENSE at the top of this source tree for license information.
 
9
 */
 
10
 
 
11
#ifndef _LIST_H
 
12
#define _LIST_H
 
13
 
 
14
/*
 
15
 * Double-linked list definitons and macros.
 
16
 */
 
17
 
 
18
struct list_head {
 
19
        struct list_head *next;
 
20
        struct list_head *prev;
 
21
};
 
22
 
 
23
#define INIT_LIST_HEAD(a)       do { (a)->next = (a)->prev = a; } while(0)
 
24
 
 
25
#define LIST_HEAD(a)    struct list_head a = { .next = &a, .prev = &a }
 
26
 
 
27
#define list_empty(pos) ((pos)->next == pos)
 
28
 
 
29
static inline void
 
30
__list_add(struct list_head *new,
 
31
           struct list_head *prev, struct list_head *next)
 
32
{
 
33
        next->prev = new;
 
34
        new->next = next;
 
35
        new->prev = prev;
 
36
        prev->next = new;
 
37
}
 
38
 
 
39
/* Add an element 'new' after position 'pos' to a list. */
 
40
#define list_add(new, pos)      __list_add(new, pos, (pos)->next)
 
41
 
 
42
/* Add an element 'new' before position 'pos' to a list. */
 
43
#define list_add_tail(new, pos) __list_add(new, (pos)->prev, pos)
 
44
 
 
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; \
 
50
}
 
51
 
 
52
#define list_del_init(pos) { \
 
53
        list_del(pos); \
 
54
        INIT_LIST_HEAD(pos); \
 
55
}
 
56
 
 
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)))
 
60
 
 
61
/* Walk a list. */
 
62
#define list_for_each(pos, head) \
 
63
        for (pos = (head)->next; pos != head; pos = pos->next)
 
64
 
 
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))
 
70
 
 
71
/*
 
72
 * Walk a list using a temporary pointer,
 
73
 * so that elements can be deleted safely.
 
74
 */
 
75
#define list_for_each_safe(pos, n, head) \
 
76
        for (pos = (head)->next, n = pos->next; \
 
77
             pos != (head); \
 
78
             pos = n, n = pos->next)
 
79
 
 
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))
 
85
 
 
86
#endif