[PATCH v3] erofs-utils: fix bitops fls_long()

Gao Xiang hsiangkao at linux.alibaba.com
Tue Jul 9 18:23:53 AEST 2024



On 2024/7/9 15:38, Hongzhen Luo wrote:
> The `__builtin_clz` is for unsigned int, while it is applied
> to unsigned long. This fixes it by using `__builtin_clzl`.
> 
> It does not impact any existing use cases in the whole codebase,
> since the only caller of `fls_long` is `roundup_pow_of_two` in
> `erofs_init_devices`, and the default compile optimization level
> is O2. At this level, the argument passed to `roundup_pow_of_two`
> is optimized into a constant, bypassing the logic of `fls_long`.

`roundup_pow_of_two()` in `erofs_init_devices()` could give
wrong results although the current compiler optimization level
"-O2" covers it up.


> 
> Signed-off-by: Hongzhen Luo <hongzhen at linux.alibaba.com>

No need to resend, I will update manually.

Thanks,
Gao Xiang

> ---
> v3: Update the commit message.
> v2: https://lore.kernel.org/all/20240709050700.2911563-1-hongzhen@linux.alibaba.com/
> v1: https://lore.kernel.org/all/20240709022031.2752872-1-hongzhen@linux.alibaba.com/
> ---
>   include/erofs/defs.h | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/include/erofs/defs.h b/include/erofs/defs.h
> index e0798c8..310a6ab 100644
> --- a/include/erofs/defs.h
> +++ b/include/erofs/defs.h
> @@ -288,7 +288,7 @@ static inline u32 get_unaligned_le64(const void *p)
>   
>   static inline unsigned int fls_long(unsigned long x)
>   {
> -	return x ? sizeof(x) * 8 - __builtin_clz(x) : 0;
> +	return x ? sizeof(x) * 8 - __builtin_clzl(x) : 0;
>   }
>   
>   static inline unsigned long lowbit(unsigned long n)


More information about the Linux-erofs mailing list