[Lustre-devel] portability in lustre code.

Alexey Lyahkov alexey_lyashkov at xyratex.com
Sat Sep 21 01:39:28 PDT 2013

Hi All,

I "happy" to see moving to lustre kernel generate a first results.
my MacOS fuse client brooked to build after sources updates.

In file included from /Users/shadow/work/lustre/work/WC-review/mac-os/libcfs/include/libcfs/posix/libcfs.h:108,
                 from /Users/shadow/work/lustre/work/WC-review/mac-os/libcfs/include/libcfs/libcfs.h:45,
                 from nidstrings.c:43:
/Users/shadow/work/lustre/work/WC-review/mac-os/libcfs/include/libcfs/user-bitops.h:80: error: conflicting types for ‘fls’
/usr/include/strings.h:90: error: previous declaration of ‘fls’ was here

that bug introduced by commit
commit d38d331fa6525ffc02665f48fa52f94626360631
Author: James Simmons <uja.ornl at gmail.com>
Date:   Tue Aug 27 12:51:06 2013 -0400

    LU-1346 libcfs: cleanup macros in portals_compat25.h
so that commit - isn't correctly inspected for systems other to linux and introduce a new regression for systems other then Linux.
I was pointed about similar situation in past - but hit that in real world.
Andreas, did you remember my concerns about lost portability ?

batch changes code in way without ability to replace a cfs specific function to any existent in build env.
diff --git a/libcfs/include/libcfs/user-bitops.h b/libcfs/include/libcfs/user-bitops.h
index 2e31e88..1b16ca7 100644
--- a/libcfs/include/libcfs/user-bitops.h
+++ b/libcfs/include/libcfs/user-bitops.h
@@ -76,7 +76,7 @@ static inline int test_bit(int nr, const unsigned long *addr)
 /* using binary seach */
-static __inline__ unsigned long __cfs_fls(long data)
+static __inline__ unsigned long fls(long data)
        int pos = 32;
@@ -147,8 +147,8 @@ static __inline__ unsigned long __cfs_ffs(long data)
but fls from BSD userland have a different prototype and we don't able to replace with flsl from build env.

from man page
FFS(3)                   BSD Library Functions Manual                   FFS(3)

     ffs, ffsl, fls, flsl -- find first or last bit set in a bit string
     The ffs() function appeared in 4.3BSD.  Its prototype existed previously in <string.h> before it was moved to <strings.h> for IEEE Std 1003.1-2001
     (``POSIX.1'') compliance.

     The ffsl(), fls(), and flsl() functions appeared in FreeBSD 5.3.

and we don't have a way to the replace fls with flsl for MacOS/BSD or use own implementation without reverting a cleanup for fls function.

Alexey Lyahkov
alexey_lyashkov at xyratex.com

More information about the lustre-devel mailing list