rbtree: add rbtree_postorder_for_each_entry_safe() helper
Because deletion (of the entire tree) is a relatively common use of the rbtree_postorder iteration, and because doing it safely means fiddling with temporary storage, provide a helper to simplify postorder rbtree iteration. Signed-off-by: Cody P Schafer <cody@linux.vnet.ibm.com> Reviewed-by: Seth Jennings <sjenning@linux.vnet.ibm.com> Cc: David Woodhouse <David.Woodhouse@intel.com> Cc: Rik van Riel <riel@redhat.com> Cc: Michel Lespinasse <walken@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
					parent
					
						
							
								9dee5c5151
							
						
					
				
			
			
				commit
				
					
						2b52908925
					
				
			
		
					 1 changed files with 18 additions and 0 deletions
				
			
		|  | @ -85,4 +85,22 @@ static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, | ||||||
| 	*rb_link = node; | 	*rb_link = node; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * rbtree_postorder_for_each_entry_safe - iterate over rb_root in post order of | ||||||
|  |  * given type safe against removal of rb_node entry | ||||||
|  |  * | ||||||
|  |  * @pos:	the 'type *' to use as a loop cursor. | ||||||
|  |  * @n:		another 'type *' to use as temporary storage | ||||||
|  |  * @root:	'rb_root *' of the rbtree. | ||||||
|  |  * @field:	the name of the rb_node field within 'type'. | ||||||
|  |  */ | ||||||
|  | #define rbtree_postorder_for_each_entry_safe(pos, n, root, field) \ | ||||||
|  | 	for (pos = rb_entry(rb_first_postorder(root), typeof(*pos), field),\ | ||||||
|  | 		n = rb_entry(rb_next_postorder(&pos->field), \ | ||||||
|  | 			typeof(*pos), field); \ | ||||||
|  | 	     &pos->field; \ | ||||||
|  | 	     pos = n, \ | ||||||
|  | 		n = rb_entry(rb_next_postorder(&pos->field), \ | ||||||
|  | 			typeof(*pos), field)) | ||||||
|  | 
 | ||||||
| #endif	/* _LINUX_RBTREE_H */ | #endif	/* _LINUX_RBTREE_H */ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Cody P Schafer
				Cody P Schafer