2001-09-28 17:19:17 +04:00
/* stolen from the Linux kernel. */
2001-10-01 19:14:39 +04:00
# ifndef _LVM_LIST_H
# define _LVM_LIST_H
2001-09-28 17:19:17 +04:00
/*
* Simple doubly linked list implementation .
*
* Some of the internal functions ( " __xxx " ) are useful when
* manipulating whole lists rather than single entries , as
* sometimes we already know the next / prev entries and we can
* generate better code by using them directly rather than
* using the generic single - entry routines .
*/
struct list_head {
struct list_head * next , * prev ;
} ;
# define LIST_HEAD_INIT(name) { &(name), &(name) }
# define LIST_HEAD(name) \
struct list_head name = { & name , & name }
# define INIT_LIST_HEAD(ptr) do { \
( ptr ) - > next = ( ptr ) ; ( ptr ) - > prev = ( ptr ) ; \
} while ( 0 )
/*
* Insert a new entry between two known consecutive entries .
*
* This is only for internal list manipulation where we know
* the prev / next entries already !
*/
2001-10-03 15:06:31 +04:00
static __inline__ void __list_add ( struct list_head * new ,
struct list_head * prev ,
struct list_head * next )
2001-09-28 17:19:17 +04:00
{
next - > prev = new ;
new - > next = next ;
new - > prev = prev ;
prev - > next = new ;
}
/*
* Insert a new entry after the specified head . .
*/
static __inline__ void list_add ( struct list_head * new , struct list_head * head )
{
__list_add ( new , head , head - > next ) ;
}
/*
* Insert a new entry at the tail
*/
static __inline__ void list_add_tail ( struct list_head * new , struct list_head * head )
{
__list_add ( new , head - > prev , head ) ;
}
/*
* Delete a list entry by making the prev / next entries
* point to each other .
*
* This is only for internal list manipulation where we know
* the prev / next entries already !
*/
static __inline__ void __list_del ( struct list_head * prev ,
struct list_head * next )
{
next - > prev = prev ;
prev - > next = next ;
}
static __inline__ void list_del ( struct list_head * entry )
{
__list_del ( entry - > prev , entry - > next ) ;
}
static __inline__ int list_empty ( struct list_head * head )
{
return head - > next = = head ;
}
/*
* Splice in " list " into " head "
*/
static __inline__ void list_splice ( struct list_head * list , struct list_head * head )
{
struct list_head * first = list - > next ;
if ( first ! = list ) {
struct list_head * last = list - > prev ;
struct list_head * at = head - > next ;
first - > prev = head ;
head - > next = first ;
last - > next = at ;
at - > prev = last ;
}
}
# define list_entry(ptr, type, member) \
( ( type * ) ( ( char * ) ( ptr ) - ( unsigned long ) ( & ( ( type * ) 0 ) - > member ) ) )
# define list_for_each(pos, head) \
for ( pos = ( head ) - > next ; pos ! = ( head ) ; pos = pos - > next )
# endif