diff options
Diffstat (limited to 'lib/rbtree.c')
-rw-r--r-- | lib/rbtree.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/lib/rbtree.c b/lib/rbtree.c index 08926709b4f9..61cdd0e3e538 100644 --- a/lib/rbtree.c +++ b/lib/rbtree.c | |||
@@ -107,8 +107,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) | |||
107 | 107 | ||
108 | gparent = rb_red_parent(parent); | 108 | gparent = rb_red_parent(parent); |
109 | 109 | ||
110 | if (parent == gparent->rb_left) { | 110 | tmp = gparent->rb_right; |
111 | tmp = gparent->rb_right; | 111 | if (parent != tmp) { /* parent == gparent->rb_left */ |
112 | if (tmp && rb_is_red(tmp)) { | 112 | if (tmp && rb_is_red(tmp)) { |
113 | /* | 113 | /* |
114 | * Case 1 - color flips | 114 | * Case 1 - color flips |
@@ -131,7 +131,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) | |||
131 | continue; | 131 | continue; |
132 | } | 132 | } |
133 | 133 | ||
134 | if (parent->rb_right == node) { | 134 | tmp = parent->rb_right; |
135 | if (node == tmp) { | ||
135 | /* | 136 | /* |
136 | * Case 2 - left rotate at parent | 137 | * Case 2 - left rotate at parent |
137 | * | 138 | * |
@@ -151,6 +152,7 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) | |||
151 | RB_BLACK); | 152 | RB_BLACK); |
152 | rb_set_parent_color(parent, node, RB_RED); | 153 | rb_set_parent_color(parent, node, RB_RED); |
153 | parent = node; | 154 | parent = node; |
155 | tmp = node->rb_right; | ||
154 | } | 156 | } |
155 | 157 | ||
156 | /* | 158 | /* |
@@ -162,7 +164,7 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) | |||
162 | * / \ | 164 | * / \ |
163 | * n U | 165 | * n U |
164 | */ | 166 | */ |
165 | gparent->rb_left = tmp = parent->rb_right; | 167 | gparent->rb_left = tmp; /* == parent->rb_right */ |
166 | parent->rb_right = gparent; | 168 | parent->rb_right = gparent; |
167 | if (tmp) | 169 | if (tmp) |
168 | rb_set_parent_color(tmp, gparent, RB_BLACK); | 170 | rb_set_parent_color(tmp, gparent, RB_BLACK); |
@@ -180,7 +182,8 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) | |||
180 | continue; | 182 | continue; |
181 | } | 183 | } |
182 | 184 | ||
183 | if (parent->rb_left == node) { | 185 | tmp = parent->rb_left; |
186 | if (node == tmp) { | ||
184 | /* Case 2 - right rotate at parent */ | 187 | /* Case 2 - right rotate at parent */ |
185 | parent->rb_left = tmp = node->rb_right; | 188 | parent->rb_left = tmp = node->rb_right; |
186 | node->rb_right = parent; | 189 | node->rb_right = parent; |
@@ -189,10 +192,11 @@ void rb_insert_color(struct rb_node *node, struct rb_root *root) | |||
189 | RB_BLACK); | 192 | RB_BLACK); |
190 | rb_set_parent_color(parent, node, RB_RED); | 193 | rb_set_parent_color(parent, node, RB_RED); |
191 | parent = node; | 194 | parent = node; |
195 | tmp = node->rb_left; | ||
192 | } | 196 | } |
193 | 197 | ||
194 | /* Case 3 - left rotate at gparent */ | 198 | /* Case 3 - left rotate at gparent */ |
195 | gparent->rb_right = tmp = parent->rb_left; | 199 | gparent->rb_right = tmp; /* == parent->rb_left */ |
196 | parent->rb_left = gparent; | 200 | parent->rb_left = gparent; |
197 | if (tmp) | 201 | if (tmp) |
198 | rb_set_parent_color(tmp, gparent, RB_BLACK); | 202 | rb_set_parent_color(tmp, gparent, RB_BLACK); |
@@ -223,8 +227,9 @@ static void __rb_erase_color(struct rb_node *node, struct rb_node *parent, | |||
223 | break; | 227 | break; |
224 | } else if (!parent) { | 228 | } else if (!parent) { |
225 | break; | 229 | break; |
226 | } else if (parent->rb_left == node) { | 230 | } |
227 | sibling = parent->rb_right; | 231 | sibling = parent->rb_right; |
232 | if (node != sibling) { /* node == parent->rb_left */ | ||
228 | if (rb_is_red(sibling)) { | 233 | if (rb_is_red(sibling)) { |
229 | /* | 234 | /* |
230 | * Case 1 - left rotate at parent | 235 | * Case 1 - left rotate at parent |