Hi Anil, I love your patch! Yet something to improve: [auto build test ERROR on mkp-scsi/for-next] [also build test ERROR on v4.19-rc5 next-20180926] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Himanshu-Madhani/qla2xxx-Add-FC-NVMe-Target-support/20180926-132955 base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next config: x86_64-randconfig-s0-09270145 (attached as .config) compiler: gcc-6 (Debian 6.4.0-9) 6.4.0 20171026 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 Note: the linux-review/Himanshu-Madhani/qla2xxx-Add-FC-NVMe-Target-support/20180926-132955 HEAD ac552b3775986d6ba46be8dfa15cc47511c2e47c builds fine. It only hurts bisectibility. All errors (new ones prefixed by >>): In file included from drivers/scsi//qla2xxx/qla_nvmet.c:14:0: drivers/scsi//qla2xxx/qla_nvmet.h:30:25: error: field 'nvme_cmd_iu' has incomplete type struct atio7_nvme_cmnd nvme_cmd_iu; ^~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qlt_nvmet_ls_done': drivers/scsi//qla2xxx/qla_nvmet.c:48:46: error: 'struct <anonymous>' has no member named 'cmd' struct qla_nvmet_cmd *tgt_cmd = nvme->u.nvme.cmd; ^ drivers/scsi//qla2xxx/qla_nvmet.c:58:47: error: 'struct <anonymous>' has no member named 'cmd' sp, sp->vha, nvme->u.nvme.desc, nvme->u.nvme.cmd); ^ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qla_nvmet_ls_rsp': >> drivers/scsi//qla2xxx/qla_nvmet.c:95:13: error: 'SRB_NVMET_LS' undeclared (first use in this function) sp->type = SRB_NVMET_LS; ^~~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c:95:13: note: each undeclared identifier is reported only once for each function it appears in drivers/scsi//qla2xxx/qla_nvmet.c:103:14: error: 'struct <anonymous>' has no member named 'exchange_address' nvme->u.nvme.exchange_address = tgt_cmd->atio.u.pt_ls4.exchange_address; ^ drivers/scsi//qla2xxx/qla_nvmet.c:103:49: error: 'union <anonymous>' has no member named 'pt_ls4' nvme->u.nvme.exchange_address = tgt_cmd->atio.u.pt_ls4.exchange_address; ^ drivers/scsi//qla2xxx/qla_nvmet.c:104:14: error: 'struct <anonymous>' has no member named 'nport_handle' nvme->u.nvme.nport_handle = tgt_cmd->atio.u.pt_ls4.nport_handle; ^ drivers/scsi//qla2xxx/qla_nvmet.c:104:45: error: 'union <anonymous>' has no member named 'pt_ls4' nvme->u.nvme.nport_handle = tgt_cmd->atio.u.pt_ls4.nport_handle; ^ drivers/scsi//qla2xxx/qla_nvmet.c:105:14: error: 'struct <anonymous>' has no member named 'vp_index' nvme->u.nvme.vp_index = tgt_cmd->atio.u.pt_ls4.vp_index; ^ drivers/scsi//qla2xxx/qla_nvmet.c:105:41: error: 'union <anonymous>' has no member named 'pt_ls4' nvme->u.nvme.vp_index = tgt_cmd->atio.u.pt_ls4.vp_index; ^ drivers/scsi//qla2xxx/qla_nvmet.c:107:14: error: 'struct <anonymous>' has no member named 'cmd' nvme->u.nvme.cmd = tgt_cmd; /* To be freed */ ^ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qla_nvmet_fcp_abort': >> drivers/scsi//qla2xxx/qla_nvmet.c:178:13: error: 'SRB_NVMET_SEND_ABTS' undeclared (first use in this function) sp->type = SRB_NVMET_SEND_ABTS; ^~~~~~~~~~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qla_nvmet_create_targetport': >> drivers/scsi//qla2xxx/qla_nvmet.c:240:9: error: 'ql_dbg_nvme' undeclared (first use in this function) ql_dbg(ql_dbg_nvme, vha, 0xe081, ^~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c:250:10: error: 'struct scsi_qla_host' has no member named 'targetport' &vha->targetport); ^~ drivers/scsi//qla2xxx/qla_nvmet.c:257:41: error: 'struct scsi_qla_host' has no member named 'targetport' tport = (struct qla_nvmet_tgtport *)vha->targetport->private; ^~ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qla_nvmet_delete': drivers/scsi//qla2xxx/qla_nvmet.c:276:17: error: 'volatile struct <anonymous>' has no member named 'nvmet_enabled'; did you mean 'nvme_enabled'? if (!vha->flags.nvmet_enabled) ^ drivers/scsi//qla2xxx/qla_nvmet.c:278:9: error: 'struct scsi_qla_host' has no member named 'targetport' if (vha->targetport) { ^~ drivers/scsi//qla2xxx/qla_nvmet.c:279:42: error: 'struct scsi_qla_host' has no member named 'targetport' tport = (struct qla_nvmet_tgtport *)vha->targetport->private; ^~ drivers/scsi//qla2xxx/qla_nvmet.c:281:10: error: 'ql_dbg_nvme' undeclared (first use in this function) ql_dbg(ql_dbg_nvme, vha, 0xe083, ^~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c:284:37: error: 'struct scsi_qla_host' has no member named 'targetport' nvmet_fc_unregister_targetport(vha->targetport); ^~ >> drivers/scsi//qla2xxx/qla_nvmet.c:287:3: error: implicit declaration of function 'nvmet_release_sessions' [-Werror=implicit-function-declaration] nvmet_release_sessions(vha); ^~~~~~~~~~~~~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qla_nvmet_handle_ls': >> drivers/scsi//qla2xxx/qla_nvmet.c:316:9: error: implicit declaration of function 'qla_nvmet_find_sess_by_s_id' [-Werror=implicit-function-declaration] sess = qla_nvmet_find_sess_by_s_id(vha, look_up_sid); ^~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c:316:7: warning: assignment makes pointer from integer without a cast [-Wint-conversion] sess = qla_nvmet_find_sess_by_s_id(vha, look_up_sid); ^ drivers/scsi//qla2xxx/qla_nvmet.c:330:25: error: 'union <anonymous>' has no member named 'pt_ls4' memcpy(&tgt_cmd->atio.u.pt_ls4, pt_ls4, sizeof(struct pt_ls4_rx_unsol)); ^ drivers/scsi//qla2xxx/qla_nvmet.c:341:31: error: 'struct scsi_qla_host' has no member named 'targetport' ret = nvmet_fc_rcv_ls_req(vha->targetport, ^~ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qla_nvmet_process_cmd': drivers/scsi//qla2xxx/qla_nvmet.c:373:32: error: 'struct scsi_qla_host' has no member named 'targetport' ret = nvmet_fc_rcv_fcp_req(vha->targetport, &tgt_cmd->cmd.fcp_req, ^~ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qla_nvmet_handle_abts': drivers/scsi//qla2xxx/qla_nvmet.c:414:28: error: 'struct scsi_qla_host' has no member named 'targetport' nvmet_fc_rcv_fcp_abort(vha->targetport, &cmd->cmd.fcp_req); ^~ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qla_nvmet_send_resp_ctio': drivers/scsi//qla2xxx/qla_nvmet.c:472:34: error: 'union <anonymous>' has no member named 'nvme_isp27' struct fcp_hdr *fchdr = &atio->u.nvme_isp27.fcp_hdr; ^ >> drivers/scsi//qla2xxx/qla_nvmet.c:493:13: error: 'SRB_NVMET_FCP' undeclared (first use in this function) sp->type = SRB_NVMET_FCP; ^~~~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c:497:23: error: 'struct <anonymous>' has no member named 'cmd' sp->u.iocb_cmd.u.nvme.cmd = cmd; ^ drivers/scsi//qla2xxx/qla_nvmet.c:501:10: error: 'ql_dbg_nvme' undeclared (first use in this function) ql_dbg(ql_dbg_nvme, vha, 0x3067, ^~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c:517:31: error: 'union <anonymous>' has no member named 'nvme_isp27' ctio->exchange_addr = atio->u.nvme_isp27.exchange_addr; ^ drivers/scsi//qla2xxx/qla_nvmet.c:521:19: error: 'union <anonymous>' has no member named 'nvme_isp27' c_flags = atio->u.nvme_isp27.attr << 9; ^ drivers/scsi//qla2xxx/qla_nvmet.c: In function 'qla_nvmet_send_abts_ctio': >> drivers/scsi//qla2xxx/qla_nvmet.c:747:13: error: 'SRB_NVMET_ABTS' undeclared (first use in this function) sp->type = SRB_NVMET_ABTS; ^~~~~~~~~~~~~~ drivers/scsi//qla2xxx/qla_nvmet.c:753:10: error: 'ql_dbg_nvme' undeclared (first use in this function) ql_dbg(ql_dbg_nvme, vha, 0x3067, ^~~~~~~~~~~ cc1: some warnings being treated as errors vim +/SRB_NVMET_LS +95 drivers/scsi//qla2xxx/qla_nvmet.c 36 37 /* 38 * qlt_nvmet_ls_done - 39 * Invoked by the firmware interface to indicate the completion 40 * of an LS cmd 41 * Free all associated resources of the LS cmd 42 */ 43 static void qlt_nvmet_ls_done(void *ptr, int res) 44 { 45 struct srb *sp = ptr; 46 struct srb_iocb *nvme = &sp->u.iocb_cmd; 47 struct nvmefc_tgt_ls_req *rsp = nvme->u.nvme.desc; > 48 struct qla_nvmet_cmd *tgt_cmd = nvme->u.nvme.cmd; 49 50 if (!IS_ENABLED(CONFIG_NVME_TARGET_FC)) 51 return; 52 53 ql_log(ql_log_info, sp->vha, 0x11000, 54 "Done with NVME LS4 req\n"); 55 56 ql_log(ql_log_info, sp->vha, 0x11001, 57 "sp: %p vha: %p, rsp: %p, cmd: %p\n", 58 sp, sp->vha, nvme->u.nvme.desc, nvme->u.nvme.cmd); 59 60 rsp->done(rsp); 61 /* Free tgt_cmd */ 62 kfree(tgt_cmd->buf); 63 kfree(tgt_cmd); 64 qla2x00_rel_sp(sp); 65 } 66 67 /* 68 * qla_nvmet_ls_rsp - 69 * Invoked by the nvme-t to complete the LS req. 70 * Prepare and send a response CTIO to the firmware. 71 */ 72 static int 73 qla_nvmet_ls_rsp(struct nvmet_fc_target_port *tgtport, 74 struct nvmefc_tgt_ls_req *rsp) 75 { 76 struct qla_nvmet_cmd *tgt_cmd = 77 container_of(rsp, struct qla_nvmet_cmd, cmd.ls_req); 78 struct scsi_qla_host *vha = tgt_cmd->vha; 79 struct srb_iocb *nvme; 80 int rval = QLA_FUNCTION_FAILED; 81 srb_t *sp; 82 83 ql_log(ql_log_info, vha, 0x11002, 84 "Dumping the NVMET-LS response buffer\n"); 85 ql_dump_buffer(ql_dbg_disc + ql_dbg_buffer, vha, 0x2075, 86 (uint8_t *)rsp->rspbuf, rsp->rsplen); 87 88 /* Alloc SRB structure */ 89 sp = qla2x00_get_sp(vha, NULL, GFP_ATOMIC); 90 if (!sp) { 91 ql_log(ql_log_info, vha, 0x11003, "Failed to allocate SRB\n"); 92 return -ENOMEM; 93 } 94 > 95 sp->type = SRB_NVMET_LS; 96 sp->done = qlt_nvmet_ls_done; 97 sp->vha = vha; 98 sp->fcport = tgt_cmd->fcport; 99 100 nvme = &sp->u.iocb_cmd; 101 nvme->u.nvme.rsp_dma = rsp->rspdma; 102 nvme->u.nvme.rsp_len = rsp->rsplen; 103 nvme->u.nvme.exchange_address = tgt_cmd->atio.u.pt_ls4.exchange_address; 104 nvme->u.nvme.nport_handle = tgt_cmd->atio.u.pt_ls4.nport_handle; > 105 nvme->u.nvme.vp_index = tgt_cmd->atio.u.pt_ls4.vp_index; 106 > 107 nvme->u.nvme.cmd = tgt_cmd; /* To be freed */ 108 nvme->u.nvme.desc = rsp; /* Call back to nvmet */ 109 110 rval = qla2x00_start_sp(sp); 111 if (rval != QLA_SUCCESS) { 112 ql_log(ql_log_warn, vha, 0x11004, 113 "qla2x00_start_sp failed = %d\n", rval); 114 return rval; 115 } 116 117 return 0; 118 } 119 120 /* 121 * qla_nvmet_fcp_op - 122 * Invoked by the nvme-t to complete the IO. 123 * Prepare and send a response CTIO to the firmware. 124 */ 125 static int 126 qla_nvmet_fcp_op(struct nvmet_fc_target_port *tgtport, 127 struct nvmefc_tgt_fcp_req *rsp) 128 { 129 struct qla_nvmet_cmd *tgt_cmd = 130 container_of(rsp, struct qla_nvmet_cmd, cmd.fcp_req); 131 struct scsi_qla_host *vha = tgt_cmd->vha; 132 133 if (!IS_ENABLED(CONFIG_NVME_TARGET_FC)) 134 return 0; 135 136 /* Prepare and send CTIO 82h */ 137 qla_nvmet_send_resp_ctio(vha->qpair, tgt_cmd, rsp); 138 139 return 0; 140 } 141 142 /* 143 * qla_nvmet_fcp_abort_done 144 * free up the used resources 145 */ 146 static void qla_nvmet_fcp_abort_done(void *ptr, int res) 147 { 148 srb_t *sp = ptr; 149 150 qla2x00_rel_sp(sp); 151 } 152 153 /* 154 * qla_nvmet_fcp_abort - 155 * Invoked by the nvme-t to abort an IO 156 * Send an abort to the firmware 157 */ 158 static void 159 qla_nvmet_fcp_abort(struct nvmet_fc_target_port *tgtport, 160 struct nvmefc_tgt_fcp_req *req) 161 { 162 struct qla_nvmet_cmd *tgt_cmd = 163 container_of(req, struct qla_nvmet_cmd, cmd.fcp_req); 164 struct scsi_qla_host *vha = tgt_cmd->vha; 165 struct qla_hw_data *ha = vha->hw; 166 srb_t *sp; 167 168 if (!IS_ENABLED(CONFIG_NVME_TARGET_FC)) 169 return; 170 171 /* Alloc SRB structure */ 172 sp = qla2x00_get_sp(vha, NULL, GFP_KERNEL); 173 if (!sp) { 174 ql_log(ql_log_info, vha, 0x11005, "Failed to allocate SRB\n"); 175 return; 176 } 177 > 178 sp->type = SRB_NVMET_SEND_ABTS; 179 sp->done = qla_nvmet_fcp_abort_done; 180 sp->vha = vha; 181 sp->fcport = tgt_cmd->fcport; 182 183 ha->isp_ops->abort_command(sp); 184 185 } 186 187 /* 188 * qla_nvmet_fcp_req_release - 189 * Delete the cmd from the list and free the cmd 190 */ 191 static void 192 qla_nvmet_fcp_req_release(struct nvmet_fc_target_port *tgtport, 193 struct nvmefc_tgt_fcp_req *rsp) 194 { 195 struct qla_nvmet_cmd *tgt_cmd = 196 container_of(rsp, struct qla_nvmet_cmd, cmd.fcp_req); 197 scsi_qla_host_t *vha = tgt_cmd->vha; 198 unsigned long flags; 199 200 if (!IS_ENABLED(CONFIG_NVME_TARGET_FC)) 201 return; 202 203 spin_lock_irqsave(&vha->cmd_list_lock, flags); 204 list_del(&tgt_cmd->cmd_list); 205 spin_unlock_irqrestore(&vha->cmd_list_lock, flags); 206 207 kfree(tgt_cmd); 208 } 209 210 static struct nvmet_fc_target_template qla_nvmet_fc_transport = { 211 .targetport_delete = qla_nvmet_targetport_delete, 212 .xmt_ls_rsp = qla_nvmet_ls_rsp, 213 .fcp_op = qla_nvmet_fcp_op, 214 .fcp_abort = qla_nvmet_fcp_abort, 215 .fcp_req_release = qla_nvmet_fcp_req_release, 216 .max_hw_queues = 8, 217 .max_sgl_segments = 128, 218 .max_dif_sgl_segments = 64, 219 .dma_boundary = 0xFFFFFFFF, 220 .target_features = NVMET_FCTGTFEAT_READDATA_RSP | 221 NVMET_FCTGTFEAT_CMD_IN_ISR | 222 NVMET_FCTGTFEAT_OPDONE_IN_ISR, 223 .target_priv_sz = sizeof(struct nvme_private), 224 }; 225 226 /* 227 * qla_nvmet_create_targetport - 228 * Create a targetport. Registers the template with the nvme-t 229 * layer 230 */ 231 int qla_nvmet_create_targetport(struct scsi_qla_host *vha) 232 { 233 struct nvmet_fc_port_info pinfo; 234 struct qla_nvmet_tgtport *tport; 235 int error = 0; 236 237 if (!IS_ENABLED(CONFIG_NVME_TARGET_FC)) 238 return 0; 239 > 240 ql_dbg(ql_dbg_nvme, vha, 0xe081, 241 "Creating target port for :%p\n", vha); 242 243 memset(&pinfo, 0, (sizeof(struct nvmet_fc_port_info))); 244 pinfo.node_name = wwn_to_u64(vha->node_name); 245 pinfo.port_name = wwn_to_u64(vha->port_name); 246 pinfo.port_id = vha->d_id.b24; 247 248 error = nvmet_fc_register_targetport(&pinfo, 249 &qla_nvmet_fc_transport, &vha->hw->pdev->dev, 250 &vha->targetport); 251 252 if (error) { 253 ql_dbg(ql_dbg_nvme, vha, 0xe082, 254 "Cannot register NVME transport:%d\n", error); 255 return error; 256 } 257 tport = (struct qla_nvmet_tgtport *)vha->targetport->private; 258 tport->vha = vha; 259 ql_dbg(ql_dbg_nvme, vha, 0xe082, 260 " Registered NVME transport:%p WWPN:%llx\n", 261 tport, pinfo.port_name); 262 return 0; 263 } 264 265 /* 266 * qla_nvmet_delete - 267 * Delete a targetport. 268 */ 269 int qla_nvmet_delete(struct scsi_qla_host *vha) 270 { 271 struct qla_nvmet_tgtport *tport; 272 273 if (!IS_ENABLED(CONFIG_NVME_TARGET_FC)) 274 return 0; 275 276 if (!vha->flags.nvmet_enabled) 277 return 0; 278 if (vha->targetport) { > 279 tport = (struct qla_nvmet_tgtport *)vha->targetport->private; 280 281 ql_dbg(ql_dbg_nvme, vha, 0xe083, 282 "Deleting target port :%p\n", tport); 283 init_completion(&tport->tport_del); > 284 nvmet_fc_unregister_targetport(vha->targetport); 285 wait_for_completion_timeout(&tport->tport_del, 5); 286 > 287 nvmet_release_sessions(vha); 288 } 289 return 0; 290 } 291 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Attachment:
.config.gz
Description: application/gzip