xref: /aosp_15_r20/external/exfatprogs/include/list.h (revision 508ec739de867a7549a0b8584942a00612dc5f1c)
1*508ec739SDaniel Rosenberg /* SPDX-License-Identifier: GPL-2.0-or-later */
2*508ec739SDaniel Rosenberg 
3*508ec739SDaniel Rosenberg #ifndef _LINUX_LIST_H
4*508ec739SDaniel Rosenberg #define _LINUX_LIST_H
5*508ec739SDaniel Rosenberg 
6*508ec739SDaniel Rosenberg #ifndef offsetof
7*508ec739SDaniel Rosenberg #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
8*508ec739SDaniel Rosenberg #endif
9*508ec739SDaniel Rosenberg 
10*508ec739SDaniel Rosenberg #define container_of(ptr, type, member) ({			\
11*508ec739SDaniel Rosenberg 	const typeof(((type *)0)->member) * __mptr = (ptr);	\
12*508ec739SDaniel Rosenberg 	(type *)((char *)__mptr - offsetof(type, member));	\
13*508ec739SDaniel Rosenberg 	})
14*508ec739SDaniel Rosenberg 
15*508ec739SDaniel Rosenberg /*
16*508ec739SDaniel Rosenberg  * These are non-NULL pointers that will result in page faults
17*508ec739SDaniel Rosenberg  * under normal circumstances, used to verify that nobody uses
18*508ec739SDaniel Rosenberg  * non-initialized list entries.
19*508ec739SDaniel Rosenberg  */
20*508ec739SDaniel Rosenberg #define LIST_POISON1  ((void *) 0x00100100)
21*508ec739SDaniel Rosenberg #define LIST_POISON2  ((void *) 0x00200200)
22*508ec739SDaniel Rosenberg 
23*508ec739SDaniel Rosenberg /**
24*508ec739SDaniel Rosenberg  * Simple doubly linked list implementation.
25*508ec739SDaniel Rosenberg  *
26*508ec739SDaniel Rosenberg  * Some of the internal functions ("__xxx") are useful when
27*508ec739SDaniel Rosenberg  * manipulating whole lists rather than single entries, as
28*508ec739SDaniel Rosenberg  * sometimes we already know the next/prev entries and we can
29*508ec739SDaniel Rosenberg  * generate better code by using them directly rather than
30*508ec739SDaniel Rosenberg  * using the generic single-entry routines.
31*508ec739SDaniel Rosenberg  */
32*508ec739SDaniel Rosenberg struct list_head {
33*508ec739SDaniel Rosenberg 	struct list_head *next, *prev;
34*508ec739SDaniel Rosenberg };
35*508ec739SDaniel Rosenberg 
36*508ec739SDaniel Rosenberg #define LIST_HEAD_INIT(name) { &(name), &(name) }
37*508ec739SDaniel Rosenberg 
38*508ec739SDaniel Rosenberg #define LIST_HEAD(name) \
39*508ec739SDaniel Rosenberg 	struct list_head name = LIST_HEAD_INIT(name)
40*508ec739SDaniel Rosenberg 
41*508ec739SDaniel Rosenberg #define INIT_LIST_HEAD(ptr) do { \
42*508ec739SDaniel Rosenberg 	(ptr)->next = (ptr); (ptr)->prev = (ptr); \
43*508ec739SDaniel Rosenberg } while (0)
44*508ec739SDaniel Rosenberg 
45*508ec739SDaniel Rosenberg /*
46*508ec739SDaniel Rosenberg  * Insert a new entry between two known consecutive entries.
47*508ec739SDaniel Rosenberg  *
48*508ec739SDaniel Rosenberg  * This is only for internal list manipulation where we know
49*508ec739SDaniel Rosenberg  * the prev/next entries already!
50*508ec739SDaniel Rosenberg  */
__list_add(struct list_head * new,struct list_head * prev,struct list_head * next)51*508ec739SDaniel Rosenberg static inline void __list_add(struct list_head *new,
52*508ec739SDaniel Rosenberg 			      struct list_head *prev,
53*508ec739SDaniel Rosenberg 			      struct list_head *next)
54*508ec739SDaniel Rosenberg {
55*508ec739SDaniel Rosenberg 	next->prev = new;
56*508ec739SDaniel Rosenberg 	new->next = next;
57*508ec739SDaniel Rosenberg 	new->prev = prev;
58*508ec739SDaniel Rosenberg 	prev->next = new;
59*508ec739SDaniel Rosenberg }
60*508ec739SDaniel Rosenberg 
61*508ec739SDaniel Rosenberg /**
62*508ec739SDaniel Rosenberg  * list_add - add a new entry
63*508ec739SDaniel Rosenberg  * @new: new entry to be added
64*508ec739SDaniel Rosenberg  * @head: list head to add it after
65*508ec739SDaniel Rosenberg  *
66*508ec739SDaniel Rosenberg  * Insert a new entry after the specified head.
67*508ec739SDaniel Rosenberg  * This is good for implementing stacks.
68*508ec739SDaniel Rosenberg  */
list_add(struct list_head * new,struct list_head * head)69*508ec739SDaniel Rosenberg static inline void list_add(struct list_head *new, struct list_head *head)
70*508ec739SDaniel Rosenberg {
71*508ec739SDaniel Rosenberg 	__list_add(new, head, head->next);
72*508ec739SDaniel Rosenberg }
73*508ec739SDaniel Rosenberg 
74*508ec739SDaniel Rosenberg /**
75*508ec739SDaniel Rosenberg  * list_add_tail - add a new entry
76*508ec739SDaniel Rosenberg  * @new: new entry to be added
77*508ec739SDaniel Rosenberg  * @head: list head to add it before
78*508ec739SDaniel Rosenberg  *
79*508ec739SDaniel Rosenberg  * Insert a new entry before the specified head.
80*508ec739SDaniel Rosenberg  * This is useful for implementing queues.
81*508ec739SDaniel Rosenberg  */
list_add_tail(struct list_head * new,struct list_head * head)82*508ec739SDaniel Rosenberg static inline void list_add_tail(struct list_head *new, struct list_head *head)
83*508ec739SDaniel Rosenberg {
84*508ec739SDaniel Rosenberg 	__list_add(new, head->prev, head);
85*508ec739SDaniel Rosenberg }
86*508ec739SDaniel Rosenberg 
87*508ec739SDaniel Rosenberg /*
88*508ec739SDaniel Rosenberg  * Delete a list entry by making the prev/next entries
89*508ec739SDaniel Rosenberg  * point to each other.
90*508ec739SDaniel Rosenberg  *
91*508ec739SDaniel Rosenberg  * This is only for internal list manipulation where we know
92*508ec739SDaniel Rosenberg  * the prev/next entries already!
93*508ec739SDaniel Rosenberg  */
__list_del(struct list_head * prev,struct list_head * next)94*508ec739SDaniel Rosenberg static inline void __list_del(struct list_head *prev, struct list_head *next)
95*508ec739SDaniel Rosenberg {
96*508ec739SDaniel Rosenberg 	next->prev = prev;
97*508ec739SDaniel Rosenberg 	prev->next = next;
98*508ec739SDaniel Rosenberg }
99*508ec739SDaniel Rosenberg 
100*508ec739SDaniel Rosenberg /**
101*508ec739SDaniel Rosenberg  * list_del - deletes entry from list.
102*508ec739SDaniel Rosenberg  * @entry: the element to delete from the list.
103*508ec739SDaniel Rosenberg  * Note: list_empty on entry does not return true after this, the entry is
104*508ec739SDaniel Rosenberg  * in an undefined state.
105*508ec739SDaniel Rosenberg  */
list_del(struct list_head * entry)106*508ec739SDaniel Rosenberg static inline void list_del(struct list_head *entry)
107*508ec739SDaniel Rosenberg {
108*508ec739SDaniel Rosenberg 	__list_del(entry->prev, entry->next);
109*508ec739SDaniel Rosenberg 	entry->next = LIST_POISON1;
110*508ec739SDaniel Rosenberg 	entry->prev = LIST_POISON2;
111*508ec739SDaniel Rosenberg }
112*508ec739SDaniel Rosenberg 
113*508ec739SDaniel Rosenberg /**
114*508ec739SDaniel Rosenberg  * list_del_init - deletes entry from list and reinitialize it.
115*508ec739SDaniel Rosenberg  * @entry: the element to delete from the list.
116*508ec739SDaniel Rosenberg  */
list_del_init(struct list_head * entry)117*508ec739SDaniel Rosenberg static inline void list_del_init(struct list_head *entry)
118*508ec739SDaniel Rosenberg {
119*508ec739SDaniel Rosenberg 	__list_del(entry->prev, entry->next);
120*508ec739SDaniel Rosenberg 	INIT_LIST_HEAD(entry);
121*508ec739SDaniel Rosenberg }
122*508ec739SDaniel Rosenberg 
123*508ec739SDaniel Rosenberg /**
124*508ec739SDaniel Rosenberg  * list_move - delete from one list and add as another's head
125*508ec739SDaniel Rosenberg  * @list: the entry to move
126*508ec739SDaniel Rosenberg  * @head: the head that will precede our entry
127*508ec739SDaniel Rosenberg  */
list_move(struct list_head * list,struct list_head * head)128*508ec739SDaniel Rosenberg static inline void list_move(struct list_head *list, struct list_head *head)
129*508ec739SDaniel Rosenberg {
130*508ec739SDaniel Rosenberg 	__list_del(list->prev, list->next);
131*508ec739SDaniel Rosenberg 	list_add(list, head);
132*508ec739SDaniel Rosenberg }
133*508ec739SDaniel Rosenberg 
134*508ec739SDaniel Rosenberg /**
135*508ec739SDaniel Rosenberg  * list_move_tail - delete from one list and add as another's tail
136*508ec739SDaniel Rosenberg  * @list: the entry to move
137*508ec739SDaniel Rosenberg  * @head: the head that will follow our entry
138*508ec739SDaniel Rosenberg  */
list_move_tail(struct list_head * list,struct list_head * head)139*508ec739SDaniel Rosenberg static inline void list_move_tail(struct list_head *list,
140*508ec739SDaniel Rosenberg 				  struct list_head *head)
141*508ec739SDaniel Rosenberg {
142*508ec739SDaniel Rosenberg 	__list_del(list->prev, list->next);
143*508ec739SDaniel Rosenberg 	list_add_tail(list, head);
144*508ec739SDaniel Rosenberg }
145*508ec739SDaniel Rosenberg 
146*508ec739SDaniel Rosenberg /**
147*508ec739SDaniel Rosenberg  * list_empty - tests whether a list is empty
148*508ec739SDaniel Rosenberg  * @head: the list to test.
149*508ec739SDaniel Rosenberg  */
list_empty(const struct list_head * head)150*508ec739SDaniel Rosenberg static inline int list_empty(const struct list_head *head)
151*508ec739SDaniel Rosenberg {
152*508ec739SDaniel Rosenberg 	return head->next == head;
153*508ec739SDaniel Rosenberg }
154*508ec739SDaniel Rosenberg 
__list_splice(struct list_head * list,struct list_head * head)155*508ec739SDaniel Rosenberg static inline void __list_splice(struct list_head *list,
156*508ec739SDaniel Rosenberg 				 struct list_head *head)
157*508ec739SDaniel Rosenberg {
158*508ec739SDaniel Rosenberg 	struct list_head *first = list->next;
159*508ec739SDaniel Rosenberg 	struct list_head *last = list->prev;
160*508ec739SDaniel Rosenberg 	struct list_head *at = head->next;
161*508ec739SDaniel Rosenberg 
162*508ec739SDaniel Rosenberg 	first->prev = head;
163*508ec739SDaniel Rosenberg 	head->next = first;
164*508ec739SDaniel Rosenberg 
165*508ec739SDaniel Rosenberg 	last->next = at;
166*508ec739SDaniel Rosenberg 	at->prev = last;
167*508ec739SDaniel Rosenberg }
168*508ec739SDaniel Rosenberg 
169*508ec739SDaniel Rosenberg /**
170*508ec739SDaniel Rosenberg  * list_splice - join two lists
171*508ec739SDaniel Rosenberg  * @list: the new list to add.
172*508ec739SDaniel Rosenberg  * @head: the place to add it in the first list.
173*508ec739SDaniel Rosenberg  */
list_splice(struct list_head * list,struct list_head * head)174*508ec739SDaniel Rosenberg static inline void list_splice(struct list_head *list, struct list_head *head)
175*508ec739SDaniel Rosenberg {
176*508ec739SDaniel Rosenberg 	if (!list_empty(list))
177*508ec739SDaniel Rosenberg 		__list_splice(list, head);
178*508ec739SDaniel Rosenberg }
179*508ec739SDaniel Rosenberg 
180*508ec739SDaniel Rosenberg /**
181*508ec739SDaniel Rosenberg  * list_splice_init - join two lists and reinitialise the emptied list.
182*508ec739SDaniel Rosenberg  * @list: the new list to add.
183*508ec739SDaniel Rosenberg  * @head: the place to add it in the first list.
184*508ec739SDaniel Rosenberg  *
185*508ec739SDaniel Rosenberg  * The list at @list is reinitialised
186*508ec739SDaniel Rosenberg  */
list_splice_init(struct list_head * list,struct list_head * head)187*508ec739SDaniel Rosenberg static inline void list_splice_init(struct list_head *list,
188*508ec739SDaniel Rosenberg 				    struct list_head *head)
189*508ec739SDaniel Rosenberg {
190*508ec739SDaniel Rosenberg 	if (!list_empty(list)) {
191*508ec739SDaniel Rosenberg 		__list_splice(list, head);
192*508ec739SDaniel Rosenberg 		INIT_LIST_HEAD(list);
193*508ec739SDaniel Rosenberg 	}
194*508ec739SDaniel Rosenberg }
195*508ec739SDaniel Rosenberg 
196*508ec739SDaniel Rosenberg /**
197*508ec739SDaniel Rosenberg  * list_entry - get the struct for this entry
198*508ec739SDaniel Rosenberg  * @ptr:	the &struct list_head pointer.
199*508ec739SDaniel Rosenberg  * @type:	the type of the struct this is embedded in.
200*508ec739SDaniel Rosenberg  * @member:	the name of the list_struct within the struct.
201*508ec739SDaniel Rosenberg  */
202*508ec739SDaniel Rosenberg #define list_entry(ptr, type, member) \
203*508ec739SDaniel Rosenberg 	container_of(ptr, type, member)
204*508ec739SDaniel Rosenberg 
205*508ec739SDaniel Rosenberg /**
206*508ec739SDaniel Rosenberg  * list_for_each - iterate over a list
207*508ec739SDaniel Rosenberg  * @pos:	the &struct list_head to use as a loop counter.
208*508ec739SDaniel Rosenberg  * @head:	the head for your list.
209*508ec739SDaniel Rosenberg  */
210*508ec739SDaniel Rosenberg 
211*508ec739SDaniel Rosenberg #define list_for_each(pos, head) \
212*508ec739SDaniel Rosenberg 	for (pos = (head)->next; pos != (head);	\
213*508ec739SDaniel Rosenberg 		pos = pos->next)
214*508ec739SDaniel Rosenberg 
215*508ec739SDaniel Rosenberg /**
216*508ec739SDaniel Rosenberg  * __list_for_each - iterate over a list
217*508ec739SDaniel Rosenberg  * @pos:	the &struct list_head to use as a loop counter.
218*508ec739SDaniel Rosenberg  * @head:	the head for your list.
219*508ec739SDaniel Rosenberg  *
220*508ec739SDaniel Rosenberg  * This variant differs from list_for_each() in that it's the
221*508ec739SDaniel Rosenberg  * simplest possible list iteration code, no prefetching is done.
222*508ec739SDaniel Rosenberg  * Use this for code that knows the list to be very short (empty
223*508ec739SDaniel Rosenberg  * or 1 entry) most of the time.
224*508ec739SDaniel Rosenberg  */
225*508ec739SDaniel Rosenberg #define __list_for_each(pos, head) \
226*508ec739SDaniel Rosenberg 	for (pos = (head)->next; pos != (head); pos = pos->next)
227*508ec739SDaniel Rosenberg 
228*508ec739SDaniel Rosenberg /**
229*508ec739SDaniel Rosenberg  * list_for_each_prev - iterate over a list backwards
230*508ec739SDaniel Rosenberg  * @pos:	the &struct list_head to use as a loop counter.
231*508ec739SDaniel Rosenberg  * @head:	the head for your list.
232*508ec739SDaniel Rosenberg  */
233*508ec739SDaniel Rosenberg #define list_for_each_prev(pos, head) \
234*508ec739SDaniel Rosenberg 	for (pos = (head)->prev; prefetch(pos->prev), pos != (head); \
235*508ec739SDaniel Rosenberg 		pos = pos->prev)
236*508ec739SDaniel Rosenberg 
237*508ec739SDaniel Rosenberg /**
238*508ec739SDaniel Rosenberg  * list_for_each_safe - iterate over a list safe against removal of list entry
239*508ec739SDaniel Rosenberg  * @pos:	the &struct list_head to use as a loop counter.
240*508ec739SDaniel Rosenberg  * @n:		another &struct list_head to use as temporary storage
241*508ec739SDaniel Rosenberg  * @head:	the head for your list.
242*508ec739SDaniel Rosenberg  */
243*508ec739SDaniel Rosenberg #define list_for_each_safe(pos, n, head) \
244*508ec739SDaniel Rosenberg 	for (pos = (head)->next, n = pos->next; pos != (head); \
245*508ec739SDaniel Rosenberg 		pos = n, n = pos->next)
246*508ec739SDaniel Rosenberg 
247*508ec739SDaniel Rosenberg /**
248*508ec739SDaniel Rosenberg  * list_for_each_entry - iterate over list of given type
249*508ec739SDaniel Rosenberg  * @pos:	the type * to use as a loop counter.
250*508ec739SDaniel Rosenberg  * @head:	the head for your list.
251*508ec739SDaniel Rosenberg  * @member:	the name of the list_struct within the struct.
252*508ec739SDaniel Rosenberg  */
253*508ec739SDaniel Rosenberg #define list_for_each_entry(pos, head, member)				\
254*508ec739SDaniel Rosenberg 	for (pos = list_entry((head)->next, typeof(*pos), member);	\
255*508ec739SDaniel Rosenberg 	     &pos->member != (head);					\
256*508ec739SDaniel Rosenberg 	     pos = list_entry(pos->member.next, typeof(*pos), member))
257*508ec739SDaniel Rosenberg 
258*508ec739SDaniel Rosenberg /**
259*508ec739SDaniel Rosenberg  * list_for_each_entry_reverse - iterate backwards over list of given type.
260*508ec739SDaniel Rosenberg  * @pos:	the type * to use as a loop counter.
261*508ec739SDaniel Rosenberg  * @head:	the head for your list.
262*508ec739SDaniel Rosenberg  * @member:	the name of the list_struct within the struct.
263*508ec739SDaniel Rosenberg  */
264*508ec739SDaniel Rosenberg #define list_for_each_entry_reverse(pos, head, member)			\
265*508ec739SDaniel Rosenberg 	for (pos = list_entry((head)->prev, typeof(*pos), member);	\
266*508ec739SDaniel Rosenberg 	     &pos->member != (head);	\
267*508ec739SDaniel Rosenberg 	     pos = list_entry(pos->member.prev, typeof(*pos), member))
268*508ec739SDaniel Rosenberg 
269*508ec739SDaniel Rosenberg /**
270*508ec739SDaniel Rosenberg  * list_prepare_entry - prepare a pos entry for use as a start point in
271*508ec739SDaniel Rosenberg  * list_for_each_entry_continue
272*508ec739SDaniel Rosenberg  * @pos:	the type * to use as a start point
273*508ec739SDaniel Rosenberg  * @head:	the head of the list
274*508ec739SDaniel Rosenberg  * @member:	the name of the list_struct within the struct.
275*508ec739SDaniel Rosenberg  */
276*508ec739SDaniel Rosenberg #define list_prepare_entry(pos, head, member) \
277*508ec739SDaniel Rosenberg 	((pos) ? : list_entry(head, typeof(*pos), member))
278*508ec739SDaniel Rosenberg 
279*508ec739SDaniel Rosenberg /**
280*508ec739SDaniel Rosenberg  * list_for_each_entry_continue - iterate over list of given type
281*508ec739SDaniel Rosenberg  * continuing after existing point
282*508ec739SDaniel Rosenberg  * @pos:	the type * to use as a loop counter.
283*508ec739SDaniel Rosenberg  * @head:	the head for your list.
284*508ec739SDaniel Rosenberg  * @member:	the name of the list_struct within the struct.
285*508ec739SDaniel Rosenberg  */
286*508ec739SDaniel Rosenberg #define list_for_each_entry_continue(pos, head, member)			\
287*508ec739SDaniel Rosenberg 	for (pos = list_entry(pos->member.next, typeof(*pos), member);	\
288*508ec739SDaniel Rosenberg 	     &pos->member != (head);	\
289*508ec739SDaniel Rosenberg 	     pos = list_entry(pos->member.next, typeof(*pos), member))
290*508ec739SDaniel Rosenberg 
291*508ec739SDaniel Rosenberg /**
292*508ec739SDaniel Rosenberg  * list_for_each_entry_safe - iterate over list of given type safe against
293*508ec739SDaniel Rosenberg  * removal of list entry
294*508ec739SDaniel Rosenberg  * @pos:	the type * to use as a loop counter.
295*508ec739SDaniel Rosenberg  * @n:		another type * to use as temporary storage
296*508ec739SDaniel Rosenberg  * @head:	the head for your list.
297*508ec739SDaniel Rosenberg  * @member:	the name of the list_struct within the struct.
298*508ec739SDaniel Rosenberg  */
299*508ec739SDaniel Rosenberg #define list_for_each_entry_safe(pos, n, head, member)			\
300*508ec739SDaniel Rosenberg 	for (pos = list_entry((head)->next, typeof(*pos), member),	\
301*508ec739SDaniel Rosenberg 		n = list_entry(pos->member.next, typeof(*pos), member);	\
302*508ec739SDaniel Rosenberg 	     &pos->member != (head);					\
303*508ec739SDaniel Rosenberg 	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
304*508ec739SDaniel Rosenberg 
305*508ec739SDaniel Rosenberg /**
306*508ec739SDaniel Rosenberg  * list_for_each_entry_safe_continue - iterate over list of given type
307*508ec739SDaniel Rosenberg  * continuing after existing point safe against removal of list entry
308*508ec739SDaniel Rosenberg  * @pos:	the type * to use as a loop counter.
309*508ec739SDaniel Rosenberg  * @n:		another type * to use as temporary storage
310*508ec739SDaniel Rosenberg  * @head:	the head for your list.
311*508ec739SDaniel Rosenberg  * @member:	the name of the list_struct within the struct.
312*508ec739SDaniel Rosenberg  */
313*508ec739SDaniel Rosenberg #define list_for_each_entry_safe_continue(pos, n, head, member)		\
314*508ec739SDaniel Rosenberg 	for (pos = list_entry(pos->member.next, typeof(*pos), member),	\
315*508ec739SDaniel Rosenberg 		n = list_entry(pos->member.next, typeof(*pos), member);	\
316*508ec739SDaniel Rosenberg 	     &pos->member != (head);					\
317*508ec739SDaniel Rosenberg 	     pos = n, n = list_entry(n->member.next, typeof(*n), member))
318*508ec739SDaniel Rosenberg 
319*508ec739SDaniel Rosenberg /**
320*508ec739SDaniel Rosenberg  * list_for_each_entry_safe_reverse - iterate backwards over list of given
321*508ec739SDaniel Rosenberg  * type safe against removal of list entry
322*508ec739SDaniel Rosenberg  * @pos:	the type * to use as a loop counter.
323*508ec739SDaniel Rosenberg  * @n:		another type * to use as temporary storage
324*508ec739SDaniel Rosenberg  * @head:	the head for your list.
325*508ec739SDaniel Rosenberg  * @member:	the name of the list_struct within the struct.
326*508ec739SDaniel Rosenberg  */
327*508ec739SDaniel Rosenberg #define list_for_each_entry_safe_reverse(pos, n, head, member)		\
328*508ec739SDaniel Rosenberg 	for (pos = list_entry((head)->prev, typeof(*pos), member),	\
329*508ec739SDaniel Rosenberg 		n = list_entry(pos->member.prev, typeof(*pos), member);	\
330*508ec739SDaniel Rosenberg 	     &pos->member != (head);					\
331*508ec739SDaniel Rosenberg 	     pos = n, n = list_entry(n->member.prev, typeof(*n), member))
332*508ec739SDaniel Rosenberg 
333*508ec739SDaniel Rosenberg #endif
334