[PATCH] nvme-auth: use IS_REACHABLE for nvme_auth_extract_key() declaration
Chaitanya Kulkarni
ckulkarnilinux at gmail.com
Sat Nov 1 20:17:42 PDT 2025
Fix build error when CONFIG_NVME_AUTH=m (module):
drivers/nvme/common/auth.c:158:13: error: redefinition of
'nvme_auth_extract_key'
include/linux/nvme-auth.h:25:27: note: previous definition is here
The issue occurs because when NVME_AUTH is built as a module (=m), the
preprocessor symbol CONFIG_NVME_AUTH is not defined during compilation,
but the object file auth.o is still compiled as part of nvme-auth.ko.
With #ifdef CONFIG_NVME_AUTH, the header provides a static inline stub
when the config is =m, while auth.c provides the real implementation,
causing a redefinition conflict.
Use IS_REACHABLE(CONFIG_NVME_AUTH) instead of #ifdef CONFIG_NVME_AUTH to
properly handle both built-in (=y) and modular (=m) builds. IS_REACHABLE
evaluates to true when the code is reachable, either because it's built-in
or because we're building the same module.
Fixes: e30cd923b3ed ("nvme-auth: switch to use 'struct key'")
Signed-off-by: Chaitanya Kulkarni <ckulkarnilinux at gmail.com>
---
Hi,
Please review this very carefully :-
Broken scenario with #ifdef CONFIG_NVME_AUTH:
make menuconfig --> NVMe over Fabrics In-Band Authentication --> *
nvme (nvme-6.19) # grep NVME_AUTH .config
CONFIG_NVME_AUTH_STATE=y
CONFIG_NVME_AUTH=m
nvme (nvme-6.19) #
1: Makefile compiles auth.c
obj-$(CONFIG_NVME_AUTH) += nvme-auth.o
nvme-auth-y += auth.o
auth.c gets compiled as part of nvme-auth.ko module
make[1]: Entering directory '/mnt/data/nvme/drivers/nvme'
CC [M] common/auth.o
CC [M] host/core.o
CC [M] host/sysfs.o
CC [M] target/configfs.o
CC [M] host/auth.o
CC [M] host/fabrics.o
CC [M] target/fabrics-cmd-auth.o
CC [M] target/auth.o
common/auth.c:158:13: error: redefinition of ânvme_auth_extract_keyâ
158 | struct key *nvme_auth_extract_key(struct key *keyring, const u8 *secret,
| ^~~~~~~~~~~~~~~~~~~~~
2: Preprocessor evaluates header guards in nvme-auth.h
#ifdef CONFIG_NVME_AUTH <---- CONFIG_NVME_AUTH is NOT defined when =m
Only CONFIG_NVME_AUTH_MODULE is defined!
struct key *nvme_auth_extract_key(...); <--- Declaration (NOT reached)
#else
static inline struct key *nvme_auth_extract_key(...) { <---- This is used Static inline stub
return ERR_PTR(-ENOKEY);
}
#endif
3: Compiler sees BOTH definitions when NVME_AUTH is enabled
using make menuconfig NVMe over Fabrics In-Band Authentication = *
- auth.c:158 has the real implementation: struct key *nvme_auth_extract_key(...)
- Header provides static inline stub: static inline struct key *nvme_auth_extract_key(...)
---
include/linux/nvme-auth.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/linux/nvme-auth.h b/include/linux/nvme-auth.h
index afc84a4cd94a..49a8afc16028 100644
--- a/include/linux/nvme-auth.h
+++ b/include/linux/nvme-auth.h
@@ -18,7 +18,7 @@ const char *nvme_auth_digest_name(u8 hmac_id);
size_t nvme_auth_hmac_hash_len(u8 hmac_id);
u8 nvme_auth_hmac_id(const char *hmac_name);
-#ifdef CONFIG_NVME_AUTH
+#if IS_REACHABLE(CONFIG_NVME_AUTH)
struct key *nvme_auth_extract_key(struct key *keyring, const u8 *secret,
size_t secret_len, bool *generated);
#else
--
2.40.0
More information about the Linux-nvme
mailing list