Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

staging: rtl8723bs: Fix build error with Clang when inlining is disabled

When CONFIG_NO_AUTO_INLINE was present in linux-next (which added
'-fno-inline-functions' to KBUILD_CFLAGS), an allyesconfig build with
Clang failed at the modpost stage:

ERROR: "is_broadcast_mac_addr" [drivers/staging/rtl8723bs/r8723bs.ko] undefined!
ERROR: "is_zero_mac_addr" [drivers/staging/rtl8723bs/r8723bs.ko] undefined!
ERROR: "is_multicast_mac_addr" [drivers/staging/rtl8723bs/r8723bs.ko] undefined!

These functions were marked as extern inline, meaning that if inlining
doesn't happen, the function will be undefined, as it is above.

This happens to work with GCC because the '-fno-inline-functions' option
respects the __inline attribute so all instances of these functions are
inlined as expected and the definition doesn't actually matter. However,
with Clang and '-fno-inline-functions', a function has to be marked with
the __always_inline attribute to be considered for inlining, which none
of these functions are. Clang tries to find the symbol definition
elsewhere as it was told and fails, which trickles down to modpost.

To make sure that this code compiles regardless of compiler and make the
intention of the code clearer, use 'static' to ensure these functions
are always defined, regardless of inlining. Additionally, silence a
checkpatch warning by switching from '__inline' to 'inline'.

Signed-off-by: Nathan Chancellor <natechancellor@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Nathan Chancellor and committed by
Greg Kroah-Hartman
97715058 5f74a8cb

+3 -3
+3 -3
drivers/staging/rtl8723bs/include/ieee80211.h
··· 850 850 #define IP_FMT "%pI4" 851 851 #define IP_ARG(x) (x) 852 852 853 - extern __inline int is_multicast_mac_addr(const u8 *addr) 853 + static inline int is_multicast_mac_addr(const u8 *addr) 854 854 { 855 855 return ((addr[0] != 0xff) && (0x01 & addr[0])); 856 856 } 857 857 858 - extern __inline int is_broadcast_mac_addr(const u8 *addr) 858 + static inline int is_broadcast_mac_addr(const u8 *addr) 859 859 { 860 860 return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) && \ 861 861 (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff)); 862 862 } 863 863 864 - extern __inline int is_zero_mac_addr(const u8 *addr) 864 + static inline int is_zero_mac_addr(const u8 *addr) 865 865 { 866 866 return ((addr[0] == 0x00) && (addr[1] == 0x00) && (addr[2] == 0x00) && \ 867 867 (addr[3] == 0x00) && (addr[4] == 0x00) && (addr[5] == 0x00));