diff options
Diffstat (limited to 'include/linux/list.h')
| -rw-r--r-- | include/linux/list.h | 51 | 
1 files changed, 24 insertions, 27 deletions
diff --git a/include/linux/list.h b/include/linux/list.h index cc6d2aa6b41..6a1f8df9144 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -666,54 +666,51 @@ static inline void hlist_move_list(struct hlist_head *old,  	for (pos = (head)->first; pos && ({ n = pos->next; 1; }); \  	     pos = n) +#define hlist_entry_safe(ptr, type, member) \ +	({ typeof(ptr) ____ptr = (ptr); \ +	   ____ptr ? hlist_entry(____ptr, type, member) : NULL; \ +	}) +  /**   * hlist_for_each_entry	- iterate over list of given type - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @head:	the head for your list.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry(tpos, pos, head, member)			 \ -	for (pos = (head)->first;					 \ -	     pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ -	     pos = pos->next) +#define hlist_for_each_entry(pos, head, member)				\ +	for (pos = hlist_entry_safe((head)->first, typeof(*(pos)), member);\ +	     pos;							\ +	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))  /**   * hlist_for_each_entry_continue - iterate over a hlist continuing after current point - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_continue(tpos, pos, member)		 \ -	for (pos = (pos)->next;						 \ -	     pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ -	     pos = pos->next) +#define hlist_for_each_entry_continue(pos, member)			\ +	for (pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member);\ +	     pos;							\ +	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))  /**   * hlist_for_each_entry_from - iterate over a hlist continuing from current point - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_from(tpos, pos, member)			 \ -	for (; pos &&							 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ -	     pos = pos->next) +#define hlist_for_each_entry_from(pos, member)				\ +	for (; pos;							\ +	     pos = hlist_entry_safe((pos)->member.next, typeof(*(pos)), member))  /**   * hlist_for_each_entry_safe - iterate over list of given type safe against removal of list entry - * @tpos:	the type * to use as a loop cursor. - * @pos:	the &struct hlist_node to use as a loop cursor. + * @pos:	the type * to use as a loop cursor.   * @n:		another &struct hlist_node to use as temporary storage   * @head:	the head for your list.   * @member:	the name of the hlist_node within the struct.   */ -#define hlist_for_each_entry_safe(tpos, pos, n, head, member) 		 \ -	for (pos = (head)->first;					 \ -	     pos && ({ n = pos->next; 1; }) && 				 \ -		({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ -	     pos = n) +#define hlist_for_each_entry_safe(pos, n, head, member) 		\ +	for (pos = hlist_entry_safe((head)->first, typeof(*pos), member);\ +	     pos && ({ n = pos->member.next; 1; });			\ +	     pos = hlist_entry_safe(n, typeof(*pos), member))  #endif  |