[dm-devel] [PATCH v2 08/35] libmultipath: create bitfield abstraction

Xose Vazquez Perez xose.vazquez at gmail.com
Tue Oct 27 11:41:35 UTC 2020


On 8/12/20 1:32 PM, mwilck at suse.com wrote:

> From: Martin Wilck <mwilck at suse.com>
> 
> In e32d521d ("libmultipath: coalesce_paths: fix size mismatch handling"),
> we introduced simple bitmap handling functions. We can do better. This
> patch introduces a bitfield type with overflow detection and a
> find_first_set() method.
> 
> Use this in coalesce_paths(), and adapt the unit tests. Also, add
> unit tests for "odd" bitfield sizes; so far we tested only multiples
> of 64.
> 
> Signed-off-by: Martin Wilck <mwilck at suse.com>
> ---
>   libmultipath/configure.c |   9 +-
>   libmultipath/util.c      |  22 ++++
>   libmultipath/util.h      |  56 +++++++++-
>   tests/util.c             | 231 ++++++++++++++++++++++++++++++++++-----
>   4 files changed, 281 insertions(+), 37 deletions(-)
> [...]
> diff --git a/libmultipath/util.h b/libmultipath/util.h
> index df75c4f..7ed30c7 100644
> --- a/libmultipath/util.h
> +++ b/libmultipath/util.h
> [...]
> -static inline bool is_bit_set_in_array(unsigned int bit, const uint64_t *arr)
> +/*
> + * ffsll() is also available on glibc < 2.27 if _GNU_SOURCE is defined.
> + * But relying on that would require that every program using this header file
> + * set _GNU_SOURCE during compilation, because otherwise the library and the
> + * program would use different types for bitfield_t, causing errors.
> + * That's too error prone, so if in doubt, use ffs().
> + */
> +#if __GLIBC_PREREQ(2, 27)
> +typedef unsigned long long int bitfield_t;
> +#define _ffs(x) ffsll(x)
> +#else
> +typedef unsigned int bitfield_t;
> +#define _ffs(x) ffs(x)
> +#endif
> [...]

musl-libc shows a warning(missing binary operator):

make[1]: Entering directory 'multipath-tools/libmultipath'
[...]
musl-gcc --std=gnu99  -O2 -g -fstack-protector-strong --param=ssp-buffer-size=4 -Werror -Wall -Wextra -Wformat=2 -Werror=implicit-int -Werror=implicit-function-declaration -Werror=format-security 
-Wno-clobbered -Wno-error=clobbered -Werror=cast-qual -Werror=discarded-qualifiers -pipe -DBIN_DIR=\"/sbin\" -DLIB_STRING=\"lib64\" -DRUN_DIR=\"run\" -MMD -MP -fPIC -I../libmpathcmd 
-I../libmpathpersist -I../libmultipath/nvme -DUSE_SYSTEMD=246 -DLIBDM_API_FLUSH -D_GNU_SOURCE -DLIBDM_API_COOKIE -DLIBUDEV_API_RECVBUF -DLIBDM_API_DEFERRED -DLIBDM_API_HOLD_CONTROL 
-Wp,-D_FORTIFY_SOURCE=2  -c -o devmapper.o devmapper.c
In file included from devmapper.c:19:
util.h:65:19: error: missing binary operator before token "("
    65 | #if __GLIBC_PREREQ(2, 27)
       |                   ^
make[1]: *** [../Makefile.inc:138: devmapper.o] Error 1




More information about the dm-devel mailing list