bitops: protect variables in bit_clear_unless() macro
authorMiklos Szeredi <mszeredi@redhat.com>
Mon, 15 Oct 2018 13:43:06 +0000 (15:43 +0200)
committerMiklos Szeredi <mszeredi@redhat.com>
Mon, 15 Oct 2018 13:43:06 +0000 (15:43 +0200)
Unprotected naming of local variables within bit_clear_unless() can easily
lead to using the wrong scope.

Noticed this by code review after having hit this issue in set_mask_bits()

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Fixes: 85ad1d13ee9b ("md: set MD_CHANGE_PENDING in a atomic region")
Cc: Guoqing Jiang <gqjiang@suse.com>
include/linux/bitops.h

index d18ee0e..705f7c4 100644 (file)
@@ -251,18 +251,18 @@ static __always_inline void __assign_bit(long nr, volatile unsigned long *addr,
 #endif
 
 #ifndef bit_clear_unless
-#define bit_clear_unless(ptr, _clear, _test)   \
+#define bit_clear_unless(ptr, clear, test)     \
 ({                                                             \
-       const typeof(*ptr) clear = (_clear), test = (_test);    \
-       typeof(*ptr) old, new;                                  \
+       const typeof(*(ptr)) clear__ = (clear), test__ = (test);\
+       typeof(*(ptr)) old__, new__;                            \
                                                                \
        do {                                                    \
-               old = READ_ONCE(*ptr);                  \
-               new = old & ~clear;                             \
-       } while (!(old & test) &&                               \
-                cmpxchg(ptr, old, new) != old);                \
+               old__ = READ_ONCE(*(ptr));                      \
+               new__ = old__ & ~clear__;                       \
+       } while (!(old__ & test__) &&                           \
+                cmpxchg(ptr, old__, new__) != old__);          \
                                                                \
-       !(old & test);                                          \
+       !(old__ & test__);                                      \
 })
 #endif