diff --git a/[refs] b/[refs] index 6c8d7967906e..f02e9604be66 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1f0528653e41ec230c60f5738820e8a544731399 +refs/heads/master: 6d58452dc066db61acdff7b84671db1b11a3de1c diff --git a/trunk/lib/rbtree.c b/trunk/lib/rbtree.c index 12abb8abf442..d0be5fcaafe8 100644 --- a/trunk/lib/rbtree.c +++ b/trunk/lib/rbtree.c @@ -91,8 +91,21 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) { struct rb_node *parent, *gparent; - while ((parent = rb_parent(node)) && rb_is_red(parent)) - { + while (true) { + /* + * Loop invariant: node is red + * + * If there is a black parent, we are done. + * Otherwise, take some corrective action as we don't + * want a red root or two consecutive red nodes. + */ + parent = rb_parent(node); + if (!parent) { + rb_set_black(node); + break; + } else if (rb_is_black(parent)) + break; + gparent = rb_parent(parent); if (parent == gparent->rb_left) @@ -142,8 +155,6 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) break; } } - - rb_set_black(root->rb_node); } EXPORT_SYMBOL(rb_insert_color);