Index: sys/sys/tree.h =================================================================== --- sys/sys/tree.h +++ sys/sys/tree.h @@ -340,6 +340,7 @@ #define RB_RED_MASK ((__uintptr_t)3) #define RB_FLIP_LEFT(elm, field) (RB_BITS(elm, field) ^= RB_RED_L) #define RB_FLIP_RIGHT(elm, field) (RB_BITS(elm, field) ^= RB_RED_R) +#define RB_FLIP_ALL(elm, field) (RB_BITS(elm, field) ^= RB_RED_MASK) #define RB_RED_LEFT(elm, field) ((RB_BITS(elm, field) & RB_RED_L) != 0) #define RB_RED_RIGHT(elm, field) ((RB_BITS(elm, field) & RB_RED_R) != 0) #define RB_PARENT(elm, field) ((__typeof(RB_UP(elm, field))) \ @@ -487,13 +488,14 @@ continue; \ } \ if (!RB_RED_RIGHT(elm, field)) { \ - RB_FLIP_LEFT(elm, field); \ /* coverity[uninit_use] */ \ RB_ROTATE_LEFT(head, elm, child, field);\ - if (RB_RED_LEFT(child, field)) \ - RB_FLIP_RIGHT(elm, field); \ - else if (RB_RED_RIGHT(child, field)) \ + if (RB_RED_RIGHT(child, field)) \ RB_FLIP_LEFT(parent, field); \ + if (RB_RED_LEFT(child, field)) \ + RB_FLIP_ALL(elm, field); \ + else \ + RB_FLIP_LEFT(elm, field); \ elm = child; \ } \ RB_ROTATE_RIGHT(head, parent, elm, field); \ @@ -509,13 +511,14 @@ continue; \ } \ if (!RB_RED_LEFT(elm, field)) { \ - RB_FLIP_RIGHT(elm, field); \ /* coverity[uninit_use] */ \ RB_ROTATE_RIGHT(head, elm, child, field);\ - if (RB_RED_RIGHT(child, field)) \ - RB_FLIP_LEFT(elm, field); \ - else if (RB_RED_LEFT(child, field)) \ + if (RB_RED_LEFT(child, field)) \ RB_FLIP_RIGHT(parent, field); \ + if (RB_RED_RIGHT(child, field)) \ + RB_FLIP_ALL(elm, field); \ + else \ + RB_FLIP_RIGHT(elm, field); \ elm = child; \ } \ RB_ROTATE_LEFT(head, parent, elm, field); \