lib/rbtree.c: fix typo in comment of ____rb_erase_color
In Case 3 of `sibling == parent->rb_right': Right rotation will not change color of sl and S in the diagram (i.e. should not change "sl" to "Sl", "S" to "s") In Case 3 of `sibling == parent->rb_left': (p) (p) / \ / \ S N --> sr N / \ / Sl sr S / Sl This is actually left rotation at "S", not right rotation. In Case 4 of `sibling == parent->rb_left': (p) (s) / \ / \ S N --> Sl P / \ / \ sl (sr) (sr) N This is actually right rotation at "(p)" + color flips, not left rotation + color flips. Link: http://lkml.kernel.org/r/1472391115-3702-1-git-send-email-fykcee1@gmail.com Signed-off-by: Jie Chen <fykcee1@gmail.com> Cc: Wei Yang <weiyang@linux.vnet.ibm.com> Cc: Xiao Guangrong <guangrong.xiao@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
23
lib/rbtree.c
23
lib/rbtree.c
@@ -296,11 +296,26 @@ ____rb_erase_color(struct rb_node *parent, struct rb_root *root,
|
|||||||
*
|
*
|
||||||
* (p) (p)
|
* (p) (p)
|
||||||
* / \ / \
|
* / \ / \
|
||||||
* N S --> N Sl
|
* N S --> N sl
|
||||||
* / \ \
|
* / \ \
|
||||||
* sl Sr s
|
* sl Sr S
|
||||||
* \
|
* \
|
||||||
* Sr
|
* Sr
|
||||||
|
*
|
||||||
|
* Note: p might be red, and then both
|
||||||
|
* p and sl are red after rotation(which
|
||||||
|
* breaks property 4). This is fixed in
|
||||||
|
* Case 4 (in __rb_rotate_set_parents()
|
||||||
|
* which set sl the color of p
|
||||||
|
* and set p RB_BLACK)
|
||||||
|
*
|
||||||
|
* (p) (sl)
|
||||||
|
* / \ / \
|
||||||
|
* N sl --> P S
|
||||||
|
* \ / \
|
||||||
|
* S N Sr
|
||||||
|
* \
|
||||||
|
* Sr
|
||||||
*/
|
*/
|
||||||
tmp1 = tmp2->rb_right;
|
tmp1 = tmp2->rb_right;
|
||||||
WRITE_ONCE(sibling->rb_left, tmp1);
|
WRITE_ONCE(sibling->rb_left, tmp1);
|
||||||
@@ -365,7 +380,7 @@ ____rb_erase_color(struct rb_node *parent, struct rb_root *root,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Case 3 - right rotate at sibling */
|
/* Case 3 - left rotate at sibling */
|
||||||
tmp1 = tmp2->rb_left;
|
tmp1 = tmp2->rb_left;
|
||||||
WRITE_ONCE(sibling->rb_right, tmp1);
|
WRITE_ONCE(sibling->rb_right, tmp1);
|
||||||
WRITE_ONCE(tmp2->rb_left, sibling);
|
WRITE_ONCE(tmp2->rb_left, sibling);
|
||||||
@@ -377,7 +392,7 @@ ____rb_erase_color(struct rb_node *parent, struct rb_root *root,
|
|||||||
tmp1 = sibling;
|
tmp1 = sibling;
|
||||||
sibling = tmp2;
|
sibling = tmp2;
|
||||||
}
|
}
|
||||||
/* Case 4 - left rotate at parent + color flips */
|
/* Case 4 - right rotate at parent + color flips */
|
||||||
tmp2 = sibling->rb_right;
|
tmp2 = sibling->rb_right;
|
||||||
WRITE_ONCE(parent->rb_left, tmp2);
|
WRITE_ONCE(parent->rb_left, tmp2);
|
||||||
WRITE_ONCE(sibling->rb_right, parent);
|
WRITE_ONCE(sibling->rb_right, parent);
|
||||||
|
Reference in New Issue
Block a user