lib/rbtree.c: fix typo in comment of ____rb_erase_color
authorJie Chen <fykcee1@gmail.com>
Tue, 13 Dec 2016 00:46:17 +0000 (16:46 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 13 Dec 2016 02:55:09 +0000 (18:55 -0800)
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>
lib/rbtree.c

index eb8a19fee11003adbb5ca62fd6eefa8033d6dbcd..1f8b112a7c359152260cddf15448826dda98bb91 100644 (file)
@@ -296,11 +296,26 @@ ____rb_erase_color(struct rb_node *parent, struct rb_root *root,
                                 *
                                 *   (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
                                 */
                                tmp1 = tmp2->rb_right;
                                WRITE_ONCE(sibling->rb_left, tmp1);
@@ -365,7 +380,7 @@ ____rb_erase_color(struct rb_node *parent, struct rb_root *root,
                                        }
                                        break;
                                }
-                               /* Case 3 - right rotate at sibling */
+                               /* Case 3 - left rotate at sibling */
                                tmp1 = tmp2->rb_left;
                                WRITE_ONCE(sibling->rb_right, tmp1);
                                WRITE_ONCE(tmp2->rb_left, sibling);
@@ -377,7 +392,7 @@ ____rb_erase_color(struct rb_node *parent, struct rb_root *root,
                                tmp1 = sibling;
                                sibling = tmp2;
                        }
-                       /* Case 4 - left rotate at parent + color flips */
+                       /* Case 4 - right rotate at parent + color flips */
                        tmp2 = sibling->rb_right;
                        WRITE_ONCE(parent->rb_left, tmp2);
                        WRITE_ONCE(sibling->rb_right, parent);