Commit ce093a04 authored by Jie Chen's avatar Jie Chen Committed by Linus Torvalds

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.comSigned-off-by: default avatarJie Chen <fykcee1@gmail.com>
Cc: Wei Yang <weiyang@linux.vnet.ibm.com>
Cc: Xiao Guangrong <guangrong.xiao@linux.intel.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6b2a65c7
...@@ -296,9 +296,24 @@ ____rb_erase_color(struct rb_node *parent, struct rb_root *root, ...@@ -296,9 +296,24 @@ ____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
*
* 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 * Sr
*/ */
...@@ -365,7 +380,7 @@ ____rb_erase_color(struct rb_node *parent, struct rb_root *root, ...@@ -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, ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment