static inline void INIT_LIST_HEAD(struct list_head *head)
{
+ head->next = head;
+ head->prev = head;
+}
+
+static inline void list_add_helper(struct list_head *new,
+ struct list_head *prev,
+ struct list_head *next)
+{
+ new->prev = prev;
+ new->next = next;
+ next->prev = new;
+ prev->next = new;
}
/*
*/
static inline void list_add(struct list_head *new, struct list_head *head)
{
+ list_add_helper(new, head, head->next);
}
/*
*/
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
-}
-
-/*
- * Delete all entries between prev and next
- *
- * Should be used only internally
- */
-static inline void __list_del(struct list_head *prev, struct list_head *next)
-{
-}
-
-/*
- * Remove given element from the list
- *
- * Should be used only internally
- */
-static inline void __list_del_entry(struct list_head *entry)
-{
+ list_add_helper(new, head->prev, head);
}
/*
*/
static inline void list_del(struct list_head *entry)
{
+ entry->next->prev = entry->prev;
+ entry->prev->next = entry->next;
+
+#ifdef FAULTD_DEBUG_LIST
+ entry->prev = LIST_POISON1;
+ entry->next = LIST_POISON2;
+#endif
}
/*
*/
static inline void list_del_init(struct list_head *entry)
{
+ list_del(entry);
+ INIT_LIST_HEAD(entry);
}
static inline int list_empty(const struct list_head *head)
{
+ return head->next == head;
}
static inline int list_is_singular(const struct list_head *head)
{
+ return (!list_empty(head) && head->prev == head->next);
}
-#define list_entry(ptr, type, member)
-
+#define list_entry(ptr, type, member) \
+ container_of((ptr), type, member)
-#define list_first_entry(ptr, type, member)
+#define list_first_entry(ptr, type, member) \
+ list_entry((ptr)->next, type, member)
-#define list_first_entry_or_null(ptr, type, member)
+#define list_first_entry_or_null(ptr, type, member) \
+ (list_empty(ptr) ? NULL : list_first_entry((ptr), type, member))
-#define list_last_entry(ptr, type, member)
+#define list_last_entry(ptr, type, member) \
+ list_entry((ptr)->prev, type, member)
-#define list_next_entry(pos, member)
+#define list_next_entry(pos, member) \
+ list_entry((pos)->member.next, typeof(*pos), member)
-#define list_prev_entry(pos, member)
+#define list_prev_entry(pos, member) \
+ list_entry((pos)->member.prev, typeof(*pos), member)
-#define list_for_each(pos, head)
+#define list_for_each(pos, head) for ( \
+ (pos) = (head)->next; \
+ (pos) != (head); \
+ (pos) = (pos)->next)
-#define list_for_each_safe(pos, n, head)
+#define list_for_each_safe(pos, n, head) for ( \
+ (pos) = (head)->next, (n) = (pos)->next; \
+ (pos) != (head); \
+ (pos) = (n), (n) = (pos)->next)
-#define list_for_each_entry(pos, head, member)
+#define list_for_each_entry(pos, head, member) for ( \
+ (pos) = list_first_entry((head), typeof(*pos), member); \
+ &(pos)->member != (head); \
+ (pos) = list_next_entry((pos), member))
-#define list_for_each_entry_safe(pos, n, head, member)
+#define list_for_each_entry_safe(pos, n, head, member) for ( \
+ (pos) = list_first_entry((head), typeof(*pos), member), \
+ (n) = list_next_entry((pos), member); \
+ &(pos)->member != (head); \
+ (pos) = (n), \
+ (n) = list_next_entry((pos), member))
#endif /* _FAULTD_LIST_H */