Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit edfa8728 authored by Miklos Szeredi's avatar Miklos Szeredi
Browse files

bitops: protect variables in bit_clear_unless() macro



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: default avatarMiklos Szeredi <mszeredi@redhat.com>
Fixes: 85ad1d13 ("md: set MD_CHANGE_PENDING in a atomic region")
Cc: Guoqing Jiang <gqjiang@suse.com>
parent 18127429
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -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