|  | struct list { | 
|  | struct list *next, *prev; | 
|  | }; | 
|  |  | 
|  | static inline void | 
|  | list_init(struct list *list) | 
|  | { | 
|  | list->next = list; | 
|  | list->prev = list; | 
|  | } | 
|  |  | 
|  | static inline int | 
|  | list_empty(struct list *list) | 
|  | { | 
|  | return list->next == list; | 
|  | } | 
|  |  | 
|  | static inline void | 
|  | list_insert(struct list *link, struct list *new_link) | 
|  | { | 
|  | new_link->prev		= link->prev; | 
|  | new_link->next		= link; | 
|  | new_link->prev->next	= new_link; | 
|  | new_link->next->prev	= new_link; | 
|  | } | 
|  |  | 
|  | static inline void | 
|  | list_append(struct list *list, struct list *new_link) | 
|  | { | 
|  | list_insert((struct list *)list, new_link); | 
|  | } | 
|  |  | 
|  | static inline void | 
|  | list_prepend(struct list *list, struct list *new_link) | 
|  | { | 
|  | list_insert(list->next, new_link); | 
|  | } | 
|  |  | 
|  | static inline void | 
|  | list_remove(struct list *link) | 
|  | { | 
|  | link->prev->next = link->next; | 
|  | link->next->prev = link->prev; | 
|  | } | 
|  |  | 
|  | #define list_entry(link, type, member) \ | 
|  | ((type *)((char *)(link)-(unsigned long)(&((type *)0)->member))) | 
|  |  | 
|  | #define list_head(list, type, member)		\ | 
|  | list_entry((list)->next, type, member) | 
|  |  | 
|  | #define list_tail(list, type, member)		\ | 
|  | list_entry((list)->prev, type, member) | 
|  |  | 
|  | #define list_next(elm, member)					\ | 
|  | list_entry((elm)->member.next, typeof(*elm), member) | 
|  |  | 
|  | #define list_for_each_entry(pos, list, member)			\ | 
|  | for (pos = list_head(list, typeof(*pos), member);	\ | 
|  | &pos->member != (list);				\ | 
|  | pos = list_next(pos, member)) | 
|  |  |