Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.infradead.org/~dwmw2/rbtree-2.6

* git://git.infradead.org/~dwmw2/rbtree-2.6:
[RBTREE] Switch rb_colour() et al to en_US spelling of 'color' for consistency
Update UML kernel/physmem.c to use rb_parent() accessor macro
[RBTREE] Update hrtimers to use rb_parent() accessor macro.
[RBTREE] Add explicit alignment to sizeof(long) for struct rb_node.
[RBTREE] Merge colour and parent fields of struct rb_node.
[RBTREE] Remove dead code in rb_erase()
[RBTREE] Update JFFS2 to use rb_parent() accessor macro.
[RBTREE] Update eventpoll.c to use rb_parent() accessor macro.
[RBTREE] Update key.c to use rb_parent() accessor macro.
[RBTREE] Update ext3 to use rb_parent() accessor macro.
[RBTREE] Change rbtree off-tree marking in I/O schedulers.
[RBTREE] Add accessor macros for colour and parent fields of rb_node

+140 -136
+1 -1
arch/um/kernel/physmem.c
··· 69 69 panic("Physical remapping for %p already present", 70 70 desc->virt); 71 71 72 - rb_link_node(&desc->rb, (*n)->rb_parent, n); 72 + rb_link_node(&desc->rb, rb_parent(*n), n); 73 73 rb_insert_color(&desc->rb, &phys_mappings); 74 74 } 75 75
+2 -3
block/as-iosched.c
··· 353 353 /* 354 354 * rb tree support functions 355 355 */ 356 - #define RB_NONE (2) 357 356 #define RB_EMPTY(root) ((root)->rb_node == NULL) 358 - #define ON_RB(node) ((node)->rb_color != RB_NONE) 359 - #define RB_CLEAR(node) ((node)->rb_color = RB_NONE) 357 + #define ON_RB(node) (rb_parent(node) != node) 358 + #define RB_CLEAR(node) (rb_set_parent(node, node)) 360 359 #define rb_entry_arq(node) rb_entry((node), struct as_rq, rb_node) 361 360 #define ARQ_RB_ROOT(ad, arq) (&(ad)->sort_list[(arq)->is_sync]) 362 361 #define rq_rb_key(rq) (rq)->sector
+1 -7
block/cfq-iosched.c
··· 60 60 /* 61 61 * rb-tree defines 62 62 */ 63 - #define RB_NONE (2) 64 63 #define RB_EMPTY(node) ((node)->rb_node == NULL) 65 - #define RB_CLEAR_COLOR(node) (node)->rb_color = RB_NONE 66 64 #define RB_CLEAR(node) do { \ 67 - (node)->rb_parent = NULL; \ 68 - RB_CLEAR_COLOR((node)); \ 69 - (node)->rb_right = NULL; \ 70 - (node)->rb_left = NULL; \ 65 + memset(node, 0, sizeof(*node)); \ 71 66 } while (0) 72 67 #define RB_CLEAR_ROOT(root) ((root)->rb_node = NULL) 73 68 #define rb_entry_crq(node) rb_entry((node), struct cfq_rq, rb_node) ··· 562 567 cfq_update_next_crq(crq); 563 568 564 569 rb_erase(&crq->rb_node, &cfqq->sort_list); 565 - RB_CLEAR_COLOR(&crq->rb_node); 566 570 567 571 if (cfq_cfqq_on_rr(cfqq) && RB_EMPTY(&cfqq->sort_list)) 568 572 cfq_del_cfqq_rr(cfqd, cfqq);
+2 -3
block/deadline-iosched.c
··· 165 165 /* 166 166 * rb tree support functions 167 167 */ 168 - #define RB_NONE (2) 169 168 #define RB_EMPTY(root) ((root)->rb_node == NULL) 170 - #define ON_RB(node) ((node)->rb_color != RB_NONE) 171 - #define RB_CLEAR(node) ((node)->rb_color = RB_NONE) 169 + #define ON_RB(node) (rb_parent(node) != node) 170 + #define RB_CLEAR(node) (rb_set_parent(node, node)) 172 171 #define rb_entry_drq(node) rb_entry((node), struct deadline_rq, rb_node) 173 172 #define DRQ_RB_ROOT(dd, drq) (&(dd)->sort_list[rq_data_dir((drq)->request)]) 174 173 #define rq_rb_key(rq) (rq)->sector
+3 -3
fs/eventpoll.c
··· 337 337 /* Special initialization for the rb-tree node to detect linkage */ 338 338 static inline void ep_rb_initnode(struct rb_node *n) 339 339 { 340 - n->rb_parent = n; 340 + rb_set_parent(n, n); 341 341 } 342 342 343 343 /* Removes a node from the rb-tree and marks it for a fast is-linked check */ 344 344 static inline void ep_rb_erase(struct rb_node *n, struct rb_root *r) 345 345 { 346 346 rb_erase(n, r); 347 - n->rb_parent = n; 347 + rb_set_parent(n, n); 348 348 } 349 349 350 350 /* Fast check to verify that the item is linked to the main rb-tree */ 351 351 static inline int ep_rb_linked(struct rb_node *n) 352 352 { 353 - return n->rb_parent != n; 353 + return rb_parent(n) != n; 354 354 } 355 355 356 356 /*
+1 -1
fs/ext3/dir.c
··· 284 284 * beginning of the loop and try to free the parent 285 285 * node. 286 286 */ 287 - parent = n->rb_parent; 287 + parent = rb_parent(n); 288 288 fname = rb_entry(n, struct fname, rb_hash); 289 289 while (fname) { 290 290 struct fname * old = fname;
-1
fs/jffs2/nodelist.h
··· 315 315 return rb_entry(node, struct jffs2_node_frag, rb); 316 316 } 317 317 318 - #define rb_parent(rb) ((rb)->rb_parent) 319 318 #define frag_next(frag) rb_entry(rb_next(&(frag)->rb), struct jffs2_node_frag, rb) 320 319 #define frag_prev(frag) rb_entry(rb_prev(&(frag)->rb), struct jffs2_node_frag, rb) 321 320 #define frag_parent(frag) rb_entry(rb_parent(&(frag)->rb), struct jffs2_node_frag, rb)
+9 -9
fs/jffs2/readinode.c
··· 66 66 jffs2_free_full_dnode(tn->fn); 67 67 jffs2_free_tmp_dnode_info(tn); 68 68 69 - this = this->rb_parent; 69 + this = rb_parent(this); 70 70 if (!this) 71 71 break; 72 72 ··· 708 708 jffs2_mark_node_obsolete(c, fn->raw); 709 709 710 710 BUG_ON(rb->rb_left); 711 - if (rb->rb_parent && rb->rb_parent->rb_left == rb) { 711 + if (rb_parent(rb) && rb_parent(rb)->rb_left == rb) { 712 712 /* We were then left-hand child of our parent. We need 713 713 * to move our own right-hand child into our place. */ 714 714 repl_rb = rb->rb_right; 715 715 if (repl_rb) 716 - repl_rb->rb_parent = rb->rb_parent; 716 + rb_set_parent(repl_rb, rb_parent(rb)); 717 717 } else 718 718 repl_rb = NULL; 719 719 ··· 721 721 722 722 /* Remove the spent tn from the tree; don't bother rebalancing 723 723 * but put our right-hand child in our own place. */ 724 - if (tn->rb.rb_parent) { 725 - if (tn->rb.rb_parent->rb_left == &tn->rb) 726 - tn->rb.rb_parent->rb_left = repl_rb; 727 - else if (tn->rb.rb_parent->rb_right == &tn->rb) 728 - tn->rb.rb_parent->rb_right = repl_rb; 724 + if (rb_parent(&tn->rb)) { 725 + if (rb_parent(&tn->rb)->rb_left == &tn->rb) 726 + rb_parent(&tn->rb)->rb_left = repl_rb; 727 + else if (rb_parent(&tn->rb)->rb_right == &tn->rb) 728 + rb_parent(&tn->rb)->rb_right = repl_rb; 729 729 else BUG(); 730 730 } else if (tn->rb.rb_right) 731 - tn->rb.rb_right->rb_parent = NULL; 731 + rb_set_parent(tn->rb.rb_right, NULL); 732 732 733 733 jffs2_free_tmp_dnode_info(tn); 734 734 if (ret) {
+1 -1
include/linux/hrtimer.h
··· 127 127 128 128 static inline int hrtimer_active(const struct hrtimer *timer) 129 129 { 130 - return timer->node.rb_parent != HRTIMER_INACTIVE; 130 + return rb_parent(&timer->node) != &timer->node; 131 131 } 132 132 133 133 /* Forward a hrtimer so it expires after now: */
+21 -5
include/linux/rbtree.h
··· 99 99 100 100 struct rb_node 101 101 { 102 - struct rb_node *rb_parent; 103 - int rb_color; 102 + unsigned long rb_parent_color; 104 103 #define RB_RED 0 105 104 #define RB_BLACK 1 106 105 struct rb_node *rb_right; 107 106 struct rb_node *rb_left; 108 - }; 107 + } __attribute__((aligned(sizeof(long)))); 108 + /* The alignment might seem pointless, but allegedly CRIS needs it */ 109 109 110 110 struct rb_root 111 111 { 112 112 struct rb_node *rb_node; 113 113 }; 114 + 115 + 116 + #define rb_parent(r) ((struct rb_node *)((r)->rb_parent_color & ~3)) 117 + #define rb_color(r) ((r)->rb_parent_color & 1) 118 + #define rb_is_red(r) (!rb_color(r)) 119 + #define rb_is_black(r) rb_color(r) 120 + #define rb_set_red(r) do { (r)->rb_parent_color &= ~1; } while (0) 121 + #define rb_set_black(r) do { (r)->rb_parent_color |= 1; } while (0) 122 + 123 + static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p) 124 + { 125 + rb->rb_parent_color = (rb->rb_parent_color & 3) | (unsigned long)p; 126 + } 127 + static inline void rb_set_color(struct rb_node *rb, int color) 128 + { 129 + rb->rb_parent_color = (rb->rb_parent_color & ~1) | color; 130 + } 114 131 115 132 #define RB_ROOT (struct rb_root) { NULL, } 116 133 #define rb_entry(ptr, type, member) container_of(ptr, type, member) ··· 148 131 static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, 149 132 struct rb_node ** rb_link) 150 133 { 151 - node->rb_parent = parent; 152 - node->rb_color = RB_RED; 134 + node->rb_parent_color = (unsigned long )parent; 153 135 node->rb_left = node->rb_right = NULL; 154 136 155 137 *rb_link = node;
+2 -2
kernel/hrtimer.c
··· 393 393 if (base->first == &timer->node) 394 394 base->first = rb_next(&timer->node); 395 395 rb_erase(&timer->node, &base->active); 396 - timer->node.rb_parent = HRTIMER_INACTIVE; 396 + rb_set_parent(&timer->node, &timer->node); 397 397 } 398 398 399 399 /* ··· 582 582 clock_id = CLOCK_MONOTONIC; 583 583 584 584 timer->base = &bases[clock_id]; 585 - timer->node.rb_parent = HRTIMER_INACTIVE; 585 + rb_set_parent(&timer->node, &timer->node); 586 586 } 587 587 EXPORT_SYMBOL_GPL(hrtimer_init); 588 588
+93 -96
lib/rbtree.c
··· 26 26 static void __rb_rotate_left(struct rb_node *node, struct rb_root *root) 27 27 { 28 28 struct rb_node *right = node->rb_right; 29 + struct rb_node *parent = rb_parent(node); 29 30 30 31 if ((node->rb_right = right->rb_left)) 31 - right->rb_left->rb_parent = node; 32 + rb_set_parent(right->rb_left, node); 32 33 right->rb_left = node; 33 34 34 - if ((right->rb_parent = node->rb_parent)) 35 + rb_set_parent(right, parent); 36 + 37 + if (parent) 35 38 { 36 - if (node == node->rb_parent->rb_left) 37 - node->rb_parent->rb_left = right; 39 + if (node == parent->rb_left) 40 + parent->rb_left = right; 38 41 else 39 - node->rb_parent->rb_right = right; 42 + parent->rb_right = right; 40 43 } 41 44 else 42 45 root->rb_node = right; 43 - node->rb_parent = right; 46 + rb_set_parent(node, right); 44 47 } 45 48 46 49 static void __rb_rotate_right(struct rb_node *node, struct rb_root *root) 47 50 { 48 51 struct rb_node *left = node->rb_left; 52 + struct rb_node *parent = rb_parent(node); 49 53 50 54 if ((node->rb_left = left->rb_right)) 51 - left->rb_right->rb_parent = node; 55 + rb_set_parent(left->rb_right, node); 52 56 left->rb_right = node; 53 57 54 - if ((left->rb_parent = node->rb_parent)) 58 + rb_set_parent(left, parent); 59 + 60 + if (parent) 55 61 { 56 - if (node == node->rb_parent->rb_right) 57 - node->rb_parent->rb_right = left; 62 + if (node == parent->rb_right) 63 + parent->rb_right = left; 58 64 else 59 - node->rb_parent->rb_left = left; 65 + parent->rb_left = left; 60 66 } 61 67 else 62 68 root->rb_node = left; 63 - node->rb_parent = left; 69 + rb_set_parent(node, left); 64 70 } 65 71 66 72 void rb_insert_color(struct rb_node *node, struct rb_root *root) 67 73 { 68 74 struct rb_node *parent, *gparent; 69 75 70 - while ((parent = node->rb_parent) && parent->rb_color == RB_RED) 76 + while ((parent = rb_parent(node)) && rb_is_red(parent)) 71 77 { 72 - gparent = parent->rb_parent; 78 + gparent = rb_parent(parent); 73 79 74 80 if (parent == gparent->rb_left) 75 81 { 76 82 { 77 83 register struct rb_node *uncle = gparent->rb_right; 78 - if (uncle && uncle->rb_color == RB_RED) 84 + if (uncle && rb_is_red(uncle)) 79 85 { 80 - uncle->rb_color = RB_BLACK; 81 - parent->rb_color = RB_BLACK; 82 - gparent->rb_color = RB_RED; 86 + rb_set_black(uncle); 87 + rb_set_black(parent); 88 + rb_set_red(gparent); 83 89 node = gparent; 84 90 continue; 85 91 } ··· 100 94 node = tmp; 101 95 } 102 96 103 - parent->rb_color = RB_BLACK; 104 - gparent->rb_color = RB_RED; 97 + rb_set_black(parent); 98 + rb_set_red(gparent); 105 99 __rb_rotate_right(gparent, root); 106 100 } else { 107 101 { 108 102 register struct rb_node *uncle = gparent->rb_left; 109 - if (uncle && uncle->rb_color == RB_RED) 103 + if (uncle && rb_is_red(uncle)) 110 104 { 111 - uncle->rb_color = RB_BLACK; 112 - parent->rb_color = RB_BLACK; 113 - gparent->rb_color = RB_RED; 105 + rb_set_black(uncle); 106 + rb_set_black(parent); 107 + rb_set_red(gparent); 114 108 node = gparent; 115 109 continue; 116 110 } ··· 125 119 node = tmp; 126 120 } 127 121 128 - parent->rb_color = RB_BLACK; 129 - gparent->rb_color = RB_RED; 122 + rb_set_black(parent); 123 + rb_set_red(gparent); 130 124 __rb_rotate_left(gparent, root); 131 125 } 132 126 } 133 127 134 - root->rb_node->rb_color = RB_BLACK; 128 + rb_set_black(root->rb_node); 135 129 } 136 130 EXPORT_SYMBOL(rb_insert_color); 137 131 ··· 140 134 { 141 135 struct rb_node *other; 142 136 143 - while ((!node || node->rb_color == RB_BLACK) && node != root->rb_node) 137 + while ((!node || rb_is_black(node)) && node != root->rb_node) 144 138 { 145 139 if (parent->rb_left == node) 146 140 { 147 141 other = parent->rb_right; 148 - if (other->rb_color == RB_RED) 142 + if (rb_is_red(other)) 149 143 { 150 - other->rb_color = RB_BLACK; 151 - parent->rb_color = RB_RED; 144 + rb_set_black(other); 145 + rb_set_red(parent); 152 146 __rb_rotate_left(parent, root); 153 147 other = parent->rb_right; 154 148 } 155 - if ((!other->rb_left || 156 - other->rb_left->rb_color == RB_BLACK) 157 - && (!other->rb_right || 158 - other->rb_right->rb_color == RB_BLACK)) 149 + if ((!other->rb_left || rb_is_black(other->rb_left)) && 150 + (!other->rb_right || rb_is_black(other->rb_right))) 159 151 { 160 - other->rb_color = RB_RED; 152 + rb_set_red(other); 161 153 node = parent; 162 - parent = node->rb_parent; 154 + parent = rb_parent(node); 163 155 } 164 156 else 165 157 { 166 - if (!other->rb_right || 167 - other->rb_right->rb_color == RB_BLACK) 158 + if (!other->rb_right || rb_is_black(other->rb_right)) 168 159 { 169 - register struct rb_node *o_left; 160 + struct rb_node *o_left; 170 161 if ((o_left = other->rb_left)) 171 - o_left->rb_color = RB_BLACK; 172 - other->rb_color = RB_RED; 162 + rb_set_black(o_left); 163 + rb_set_red(other); 173 164 __rb_rotate_right(other, root); 174 165 other = parent->rb_right; 175 166 } 176 - other->rb_color = parent->rb_color; 177 - parent->rb_color = RB_BLACK; 167 + rb_set_color(other, rb_color(parent)); 168 + rb_set_black(parent); 178 169 if (other->rb_right) 179 - other->rb_right->rb_color = RB_BLACK; 170 + rb_set_black(other->rb_right); 180 171 __rb_rotate_left(parent, root); 181 172 node = root->rb_node; 182 173 break; ··· 182 179 else 183 180 { 184 181 other = parent->rb_left; 185 - if (other->rb_color == RB_RED) 182 + if (rb_is_red(other)) 186 183 { 187 - other->rb_color = RB_BLACK; 188 - parent->rb_color = RB_RED; 184 + rb_set_black(other); 185 + rb_set_red(parent); 189 186 __rb_rotate_right(parent, root); 190 187 other = parent->rb_left; 191 188 } 192 - if ((!other->rb_left || 193 - other->rb_left->rb_color == RB_BLACK) 194 - && (!other->rb_right || 195 - other->rb_right->rb_color == RB_BLACK)) 189 + if ((!other->rb_left || rb_is_black(other->rb_left)) && 190 + (!other->rb_right || rb_is_black(other->rb_right))) 196 191 { 197 - other->rb_color = RB_RED; 192 + rb_set_red(other); 198 193 node = parent; 199 - parent = node->rb_parent; 194 + parent = rb_parent(node); 200 195 } 201 196 else 202 197 { 203 - if (!other->rb_left || 204 - other->rb_left->rb_color == RB_BLACK) 198 + if (!other->rb_left || rb_is_black(other->rb_left)) 205 199 { 206 200 register struct rb_node *o_right; 207 201 if ((o_right = other->rb_right)) 208 - o_right->rb_color = RB_BLACK; 209 - other->rb_color = RB_RED; 202 + rb_set_black(o_right); 203 + rb_set_red(other); 210 204 __rb_rotate_left(other, root); 211 205 other = parent->rb_left; 212 206 } 213 - other->rb_color = parent->rb_color; 214 - parent->rb_color = RB_BLACK; 207 + rb_set_color(other, rb_color(parent)); 208 + rb_set_black(parent); 215 209 if (other->rb_left) 216 - other->rb_left->rb_color = RB_BLACK; 210 + rb_set_black(other->rb_left); 217 211 __rb_rotate_right(parent, root); 218 212 node = root->rb_node; 219 213 break; ··· 218 218 } 219 219 } 220 220 if (node) 221 - node->rb_color = RB_BLACK; 221 + rb_set_black(node); 222 222 } 223 223 224 224 void rb_erase(struct rb_node *node, struct rb_root *root) ··· 238 238 while ((left = node->rb_left) != NULL) 239 239 node = left; 240 240 child = node->rb_right; 241 - parent = node->rb_parent; 242 - color = node->rb_color; 241 + parent = rb_parent(node); 242 + color = rb_color(node); 243 243 244 244 if (child) 245 - child->rb_parent = parent; 246 - if (parent) 247 - { 248 - if (parent->rb_left == node) 249 - parent->rb_left = child; 250 - else 251 - parent->rb_right = child; 252 - } 253 - else 254 - root->rb_node = child; 255 - 256 - if (node->rb_parent == old) 245 + rb_set_parent(child, parent); 246 + if (parent == old) { 247 + parent->rb_right = child; 257 248 parent = node; 258 - node->rb_parent = old->rb_parent; 259 - node->rb_color = old->rb_color; 249 + } else 250 + parent->rb_left = child; 251 + 252 + node->rb_parent_color = old->rb_parent_color; 260 253 node->rb_right = old->rb_right; 261 254 node->rb_left = old->rb_left; 262 255 263 - if (old->rb_parent) 256 + if (rb_parent(old)) 264 257 { 265 - if (old->rb_parent->rb_left == old) 266 - old->rb_parent->rb_left = node; 258 + if (rb_parent(old)->rb_left == old) 259 + rb_parent(old)->rb_left = node; 267 260 else 268 - old->rb_parent->rb_right = node; 261 + rb_parent(old)->rb_right = node; 269 262 } else 270 263 root->rb_node = node; 271 264 272 - old->rb_left->rb_parent = node; 265 + rb_set_parent(old->rb_left, node); 273 266 if (old->rb_right) 274 - old->rb_right->rb_parent = node; 267 + rb_set_parent(old->rb_right, node); 275 268 goto color; 276 269 } 277 270 278 - parent = node->rb_parent; 279 - color = node->rb_color; 271 + parent = rb_parent(node); 272 + color = rb_color(node); 280 273 281 274 if (child) 282 - child->rb_parent = parent; 275 + rb_set_parent(child, parent); 283 276 if (parent) 284 277 { 285 278 if (parent->rb_left == node) ··· 320 327 321 328 struct rb_node *rb_next(struct rb_node *node) 322 329 { 330 + struct rb_node *parent; 331 + 323 332 /* If we have a right-hand child, go down and then left as far 324 333 as we can. */ 325 334 if (node->rb_right) { ··· 337 342 ancestor is a right-hand child of its parent, keep going 338 343 up. First time it's a left-hand child of its parent, said 339 344 parent is our 'next' node. */ 340 - while (node->rb_parent && node == node->rb_parent->rb_right) 341 - node = node->rb_parent; 345 + while ((parent = rb_parent(node)) && node == parent->rb_right) 346 + node = parent; 342 347 343 - return node->rb_parent; 348 + return parent; 344 349 } 345 350 EXPORT_SYMBOL(rb_next); 346 351 347 352 struct rb_node *rb_prev(struct rb_node *node) 348 353 { 354 + struct rb_node *parent; 355 + 349 356 /* If we have a left-hand child, go down and then right as far 350 357 as we can. */ 351 358 if (node->rb_left) { ··· 359 362 360 363 /* No left-hand children. Go up till we find an ancestor which 361 364 is a right-hand child of its parent */ 362 - while (node->rb_parent && node == node->rb_parent->rb_left) 363 - node = node->rb_parent; 365 + while ((parent = rb_parent(node)) && node == parent->rb_left) 366 + node = parent; 364 367 365 - return node->rb_parent; 368 + return parent; 366 369 } 367 370 EXPORT_SYMBOL(rb_prev); 368 371 369 372 void rb_replace_node(struct rb_node *victim, struct rb_node *new, 370 373 struct rb_root *root) 371 374 { 372 - struct rb_node *parent = victim->rb_parent; 375 + struct rb_node *parent = rb_parent(victim); 373 376 374 377 /* Set the surrounding nodes to point to the replacement */ 375 378 if (parent) { ··· 381 384 root->rb_node = new; 382 385 } 383 386 if (victim->rb_left) 384 - victim->rb_left->rb_parent = new; 387 + rb_set_parent(victim->rb_left, new); 385 388 if (victim->rb_right) 386 - victim->rb_right->rb_parent = new; 389 + rb_set_parent(victim->rb_right, new); 387 390 388 391 /* Copy the pointers/colour from the victim to the replacement */ 389 392 *new = *victim;
+4 -4
security/keys/key.c
··· 211 211 key->serial = 2; 212 212 key_serial_next = key->serial + 1; 213 213 214 - if (!parent->rb_parent) 214 + if (!rb_parent(parent)) 215 215 p = &key_serial_tree.rb_node; 216 - else if (parent->rb_parent->rb_left == parent) 217 - p = &parent->rb_parent->rb_left; 216 + else if (rb_parent(parent)->rb_left == parent) 217 + p = &(rb_parent(parent)->rb_left); 218 218 else 219 - p = &parent->rb_parent->rb_right; 219 + p = &(rb_parent(parent)->rb_right); 220 220 221 221 parent = rb_next(parent); 222 222 if (!parent)