[linux-nvme:nvme-6.18 6/11] drivers/nvme/host/fabrics.c:1097:undefined reference to `nvme_auth_extract_key'
kernel test robot
lkp at intel.com
Tue Sep 30 08:45:27 PDT 2025
tree: git://git.infradead.org/nvme.git nvme-6.18
head: 876f5e3e3b1e3e78aec9b7e53bec4b949a13ce09
commit: 593a56d90ae8edc9ed64e5d3893b69fbbde77bba [6/11] nvme: parse dhchap keys during option parsing
config: csky-randconfig-002-20250930 (https://download.01.org/0day-ci/archive/20250930/202509302359.TL1868ni-lkp@intel.com/config)
compiler: csky-linux-gcc (GCC) 13.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250930/202509302359.TL1868ni-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp at intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509302359.TL1868ni-lkp@intel.com/
All errors (new ones prefixed by >>):
csky-linux-ld: drivers/nvme/host/fabrics.o: in function `nvmf_parse_options':
>> drivers/nvme/host/fabrics.c:1097:(.text+0x166c): undefined reference to `nvme_auth_extract_key'
>> csky-linux-ld: drivers/nvme/host/fabrics.c:1112:(.text+0x16e2): undefined reference to `nvme_auth_extract_key'
csky-linux-ld: drivers/nvme/host/fabrics.c:1145:(.text+0x17b8): undefined reference to `nvme_auth_extract_key'
vim +1097 drivers/nvme/host/fabrics.c
715
716 static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
717 const char *buf)
718 {
719 substring_t args[MAX_OPT_ARGS];
720 char *options, *o, *p;
721 char *host_secret = NULL, *ctrl_secret = NULL;
722 int token, ret = 0;
723 size_t nqnlen = 0;
724 int ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO, key_id;
725 uuid_t hostid;
726 char hostnqn[NVMF_NQN_SIZE];
727 struct key *key;
728
729 /* Set defaults */
730 opts->queue_size = NVMF_DEF_QUEUE_SIZE;
731 opts->nr_io_queues = num_online_cpus();
732 opts->reconnect_delay = NVMF_DEF_RECONNECT_DELAY;
733 opts->kato = 0;
734 opts->duplicate_connect = false;
735 opts->fast_io_fail_tmo = NVMF_DEF_FAIL_FAST_TMO;
736 opts->hdr_digest = false;
737 opts->data_digest = false;
738 opts->tos = -1; /* < 0 == use transport default */
739 opts->tls = false;
740 opts->tls_key = NULL;
741 opts->keyring = NULL;
742 opts->concat = false;
743 opts->dhchap_key = NULL;
744 opts->dhchap_ctrl_key = NULL;
745
746 options = o = kstrdup(buf, GFP_KERNEL);
747 if (!options)
748 return -ENOMEM;
749
750 /* use default host if not given by user space */
751 uuid_copy(&hostid, &nvmf_default_host->id);
752 strscpy(hostnqn, nvmf_default_host->nqn, NVMF_NQN_SIZE);
753
754 while ((p = strsep(&o, ",\n")) != NULL) {
755 if (!*p)
756 continue;
757
758 token = match_token(p, opt_tokens, args);
759 opts->mask |= token;
760 switch (token) {
761 case NVMF_OPT_TRANSPORT:
762 p = match_strdup(args);
763 if (!p) {
764 ret = -ENOMEM;
765 goto out;
766 }
767 kfree(opts->transport);
768 opts->transport = p;
769 break;
770 case NVMF_OPT_NQN:
771 p = match_strdup(args);
772 if (!p) {
773 ret = -ENOMEM;
774 goto out;
775 }
776 kfree(opts->subsysnqn);
777 opts->subsysnqn = p;
778 nqnlen = strlen(opts->subsysnqn);
779 if (nqnlen >= NVMF_NQN_SIZE) {
780 pr_err("%s needs to be < %d bytes\n",
781 opts->subsysnqn, NVMF_NQN_SIZE);
782 ret = -EINVAL;
783 goto out;
784 }
785 opts->discovery_nqn =
786 !(strcmp(opts->subsysnqn,
787 NVME_DISC_SUBSYS_NAME));
788 break;
789 case NVMF_OPT_TRADDR:
790 p = match_strdup(args);
791 if (!p) {
792 ret = -ENOMEM;
793 goto out;
794 }
795 kfree(opts->traddr);
796 opts->traddr = p;
797 break;
798 case NVMF_OPT_TRSVCID:
799 p = match_strdup(args);
800 if (!p) {
801 ret = -ENOMEM;
802 goto out;
803 }
804 kfree(opts->trsvcid);
805 opts->trsvcid = p;
806 break;
807 case NVMF_OPT_QUEUE_SIZE:
808 if (match_int(args, &token)) {
809 ret = -EINVAL;
810 goto out;
811 }
812 if (token < NVMF_MIN_QUEUE_SIZE ||
813 token > NVMF_MAX_QUEUE_SIZE) {
814 pr_err("Invalid queue_size %d\n", token);
815 ret = -EINVAL;
816 goto out;
817 }
818 opts->queue_size = token;
819 break;
820 case NVMF_OPT_NR_IO_QUEUES:
821 if (match_int(args, &token)) {
822 ret = -EINVAL;
823 goto out;
824 }
825 if (token <= 0) {
826 pr_err("Invalid number of IOQs %d\n", token);
827 ret = -EINVAL;
828 goto out;
829 }
830 if (opts->discovery_nqn) {
831 pr_debug("Ignoring nr_io_queues value for discovery controller\n");
832 break;
833 }
834
835 opts->nr_io_queues = min_t(unsigned int,
836 num_online_cpus(), token);
837 break;
838 case NVMF_OPT_KATO:
839 if (match_int(args, &token)) {
840 ret = -EINVAL;
841 goto out;
842 }
843
844 if (token < 0) {
845 pr_err("Invalid keep_alive_tmo %d\n", token);
846 ret = -EINVAL;
847 goto out;
848 } else if (token == 0 && !opts->discovery_nqn) {
849 /* Allowed for debug */
850 pr_warn("keep_alive_tmo 0 won't execute keep alives!!!\n");
851 }
852 opts->kato = token;
853 break;
854 case NVMF_OPT_CTRL_LOSS_TMO:
855 if (match_int(args, &token)) {
856 ret = -EINVAL;
857 goto out;
858 }
859
860 if (token < 0)
861 pr_warn("ctrl_loss_tmo < 0 will reconnect forever\n");
862 ctrl_loss_tmo = token;
863 break;
864 case NVMF_OPT_FAIL_FAST_TMO:
865 if (match_int(args, &token)) {
866 ret = -EINVAL;
867 goto out;
868 }
869
870 if (token >= 0)
871 pr_warn("I/O fail on reconnect controller after %d sec\n",
872 token);
873 else
874 token = -1;
875
876 opts->fast_io_fail_tmo = token;
877 break;
878 case NVMF_OPT_HOSTNQN:
879 if (opts->host) {
880 pr_err("hostnqn already user-assigned: %s\n",
881 opts->host->nqn);
882 ret = -EADDRINUSE;
883 goto out;
884 }
885 p = match_strdup(args);
886 if (!p) {
887 ret = -ENOMEM;
888 goto out;
889 }
890 nqnlen = strlen(p);
891 if (nqnlen >= NVMF_NQN_SIZE) {
892 pr_err("%s needs to be < %d bytes\n",
893 p, NVMF_NQN_SIZE);
894 kfree(p);
895 ret = -EINVAL;
896 goto out;
897 }
898 strscpy(hostnqn, p, NVMF_NQN_SIZE);
899 kfree(p);
900 break;
901 case NVMF_OPT_RECONNECT_DELAY:
902 if (match_int(args, &token)) {
903 ret = -EINVAL;
904 goto out;
905 }
906 if (token <= 0) {
907 pr_err("Invalid reconnect_delay %d\n", token);
908 ret = -EINVAL;
909 goto out;
910 }
911 opts->reconnect_delay = token;
912 break;
913 case NVMF_OPT_HOST_TRADDR:
914 p = match_strdup(args);
915 if (!p) {
916 ret = -ENOMEM;
917 goto out;
918 }
919 kfree(opts->host_traddr);
920 opts->host_traddr = p;
921 break;
922 case NVMF_OPT_HOST_IFACE:
923 p = match_strdup(args);
924 if (!p) {
925 ret = -ENOMEM;
926 goto out;
927 }
928 kfree(opts->host_iface);
929 opts->host_iface = p;
930 break;
931 case NVMF_OPT_HOST_ID:
932 p = match_strdup(args);
933 if (!p) {
934 ret = -ENOMEM;
935 goto out;
936 }
937 ret = uuid_parse(p, &hostid);
938 if (ret) {
939 pr_err("Invalid hostid %s\n", p);
940 ret = -EINVAL;
941 kfree(p);
942 goto out;
943 }
944 kfree(p);
945 break;
946 case NVMF_OPT_DUP_CONNECT:
947 opts->duplicate_connect = true;
948 break;
949 case NVMF_OPT_DISABLE_SQFLOW:
950 opts->disable_sqflow = true;
951 break;
952 case NVMF_OPT_HDR_DIGEST:
953 opts->hdr_digest = true;
954 break;
955 case NVMF_OPT_DATA_DIGEST:
956 opts->data_digest = true;
957 break;
958 case NVMF_OPT_NR_WRITE_QUEUES:
959 if (match_int(args, &token)) {
960 ret = -EINVAL;
961 goto out;
962 }
963 if (token <= 0) {
964 pr_err("Invalid nr_write_queues %d\n", token);
965 ret = -EINVAL;
966 goto out;
967 }
968 opts->nr_write_queues = token;
969 break;
970 case NVMF_OPT_NR_POLL_QUEUES:
971 if (match_int(args, &token)) {
972 ret = -EINVAL;
973 goto out;
974 }
975 if (token <= 0) {
976 pr_err("Invalid nr_poll_queues %d\n", token);
977 ret = -EINVAL;
978 goto out;
979 }
980 opts->nr_poll_queues = token;
981 break;
982 case NVMF_OPT_TOS:
983 if (match_int(args, &token)) {
984 ret = -EINVAL;
985 goto out;
986 }
987 if (token < 0) {
988 pr_err("Invalid type of service %d\n", token);
989 ret = -EINVAL;
990 goto out;
991 }
992 if (token > 255) {
993 pr_warn("Clamping type of service to 255\n");
994 token = 255;
995 }
996 opts->tos = token;
997 break;
998 case NVMF_OPT_KEYRING:
999 if (match_int(args, &key_id) || key_id <= 0) {
1000 ret = -EINVAL;
1001 goto out;
1002 }
1003 key = nvmf_parse_key(key_id);
1004 if (IS_ERR(key)) {
1005 ret = PTR_ERR(key);
1006 goto out;
1007 }
1008 key_put(opts->keyring);
1009 opts->keyring = key;
1010 break;
1011 case NVMF_OPT_TLS_KEY:
1012 if (match_int(args, &key_id) || key_id <= 0) {
1013 ret = -EINVAL;
1014 goto out;
1015 }
1016 key = nvmf_parse_key(key_id);
1017 if (IS_ERR(key)) {
1018 ret = PTR_ERR(key);
1019 goto out;
1020 }
1021 key_put(opts->tls_key);
1022 opts->tls_key = key;
1023 break;
1024 case NVMF_OPT_DISCOVERY:
1025 opts->discovery_nqn = true;
1026 break;
1027 case NVMF_OPT_DHCHAP_SECRET:
1028 p = match_strdup(args);
1029 if (!p) {
1030 ret = -ENOMEM;
1031 goto out;
1032 }
1033 kfree(host_secret);
1034 host_secret = p;
1035 break;
1036 case NVMF_OPT_DHCHAP_CTRL_SECRET:
1037 p = match_strdup(args);
1038 if (!p) {
1039 ret = -ENOMEM;
1040 goto out;
1041 }
1042 kfree(ctrl_secret);
1043 ctrl_secret = p;
1044 break;
1045 case NVMF_OPT_TLS:
1046 if (!IS_ENABLED(CONFIG_NVME_TCP_TLS)) {
1047 pr_err("TLS is not supported\n");
1048 ret = -EINVAL;
1049 goto out;
1050 }
1051 opts->tls = true;
1052 break;
1053 case NVMF_OPT_CONCAT:
1054 if (!IS_ENABLED(CONFIG_NVME_TCP_TLS)) {
1055 pr_err("TLS is not supported\n");
1056 ret = -EINVAL;
1057 goto out;
1058 }
1059 opts->concat = true;
1060 break;
1061 default:
1062 pr_warn("unknown parameter or missing value '%s' in ctrl creation request\n",
1063 p);
1064 ret = -EINVAL;
1065 goto out;
1066 }
1067 }
1068
1069 if (opts->discovery_nqn) {
1070 opts->nr_io_queues = 0;
1071 opts->nr_write_queues = 0;
1072 opts->nr_poll_queues = 0;
1073 opts->duplicate_connect = true;
1074 } else {
1075 if (!opts->kato)
1076 opts->kato = NVME_DEFAULT_KATO;
1077 }
1078 if (ctrl_loss_tmo < 0) {
1079 opts->max_reconnects = -1;
1080 } else {
1081 opts->max_reconnects = DIV_ROUND_UP(ctrl_loss_tmo,
1082 opts->reconnect_delay);
1083 if (ctrl_loss_tmo < opts->fast_io_fail_tmo)
1084 pr_warn("failfast tmo (%d) larger than controller loss tmo (%d)\n",
1085 opts->fast_io_fail_tmo, ctrl_loss_tmo);
1086 }
1087
1088 opts->host = nvmf_host_add(hostnqn, &hostid);
1089 if (IS_ERR(opts->host)) {
1090 ret = PTR_ERR(opts->host);
1091 opts->host = NULL;
1092 goto out;
1093 }
1094
1095 if (host_secret) {
1096 pr_debug("lookup host identity '%s'\n", host_secret);
> 1097 key = nvme_auth_extract_key(opts->keyring, host_secret,
1098 strlen(host_secret));
1099 if (IS_ERR(key)) {
1100 ret = PTR_ERR(key);
1101 goto out;
1102 }
1103 pr_debug("using dhchap key %08x\n", key_serial(key));
1104 opts->dhchap_key = key;
1105 }
1106 if (ctrl_secret) {
1107 if (!opts->dhchap_key) {
1108 ret = -EINVAL;
1109 goto out;
1110 }
1111 pr_debug("lookup ctrl identity '%s'\n", ctrl_secret);
> 1112 key = nvme_auth_extract_key(opts->keyring, ctrl_secret,
1113 strlen(ctrl_secret));
1114 if (IS_ERR(key)) {
1115 ret = PTR_ERR(key);
1116 goto out;
1117 }
1118 pr_debug("using dhchap ctrl key %08x\n", key_serial(key));
1119 opts->dhchap_ctrl_key = key;
1120 }
1121
1122 if (opts->concat) {
1123 if (opts->tls) {
1124 pr_err("Secure concatenation over TLS is not supported\n");
1125 ret = -EINVAL;
1126 goto out;
1127 }
1128 if (opts->tls_key) {
1129 pr_err("Cannot specify a TLS key for secure concatenation\n");
1130 ret = -EINVAL;
1131 goto out;
1132 }
1133 if (!opts->dhchap_key) {
1134 pr_err("Need to enable DH-CHAP for secure concatenation\n");
1135 ret = -EINVAL;
1136 goto out;
1137 }
1138 }
1139
1140 out:
1141 kfree(ctrl_secret);
1142 kfree(host_secret);
1143 kfree(options);
1144 return ret;
1145 }
1146
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
More information about the Linux-nvme
mailing list