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

nvme-fc: Update header and host for common definitions for LS handling

Given that both host and target now generate and receive LS's create
a single table definition for LS names. Each tranport half will have
a local version of the table.

As Create Association LS is issued by both sides, and received by
both sides, create common routines to format the LS and to validate
the LS.

Convert the host side transport to use the new common Create
Association LS formatting routine.

Signed-off-by: James Smart <jsmart2021@gmail.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

James Smart and committed by
Jens Axboe
fd5a5f22 eb4ee8f1

+81 -23
+2 -23
drivers/nvme/host/fc.c
··· 1419 1419 else 1420 1420 lsreq->private = NULL; 1421 1421 1422 - discon_rqst->w0.ls_cmd = FCNVME_LS_DISCONNECT_ASSOC; 1423 - discon_rqst->desc_list_len = cpu_to_be32( 1424 - sizeof(struct fcnvme_lsdesc_assoc_id) + 1425 - sizeof(struct fcnvme_lsdesc_disconn_cmd)); 1426 - 1427 - discon_rqst->associd.desc_tag = cpu_to_be32(FCNVME_LSDESC_ASSOC_ID); 1428 - discon_rqst->associd.desc_len = 1429 - fcnvme_lsdesc_len( 1430 - sizeof(struct fcnvme_lsdesc_assoc_id)); 1431 - 1432 - discon_rqst->associd.association_id = cpu_to_be64(ctrl->association_id); 1433 - 1434 - discon_rqst->discon_cmd.desc_tag = cpu_to_be32( 1435 - FCNVME_LSDESC_DISCONN_CMD); 1436 - discon_rqst->discon_cmd.desc_len = 1437 - fcnvme_lsdesc_len( 1438 - sizeof(struct fcnvme_lsdesc_disconn_cmd)); 1439 - 1440 - lsreq->rqstaddr = discon_rqst; 1441 - lsreq->rqstlen = sizeof(*discon_rqst); 1442 - lsreq->rspaddr = discon_acc; 1443 - lsreq->rsplen = sizeof(*discon_acc); 1444 - lsreq->timeout = NVME_FC_LS_TIMEOUT_SEC; 1422 + nvmefc_fmt_lsreq_discon_assoc(lsreq, discon_rqst, discon_acc, 1423 + ctrl->association_id); 1445 1424 1446 1425 ret = nvme_fc_send_ls_req_async(ctrl->rport, lsop, 1447 1426 nvme_fc_disconnect_assoc_done);
+79
drivers/nvme/host/fc.h
··· 17 17 */ 18 18 19 19 union nvmefc_ls_requests { 20 + struct fcnvme_ls_rqst_w0 w0; 20 21 struct fcnvme_ls_cr_assoc_rqst rq_cr_assoc; 21 22 struct fcnvme_ls_cr_conn_rqst rq_cr_conn; 22 23 struct fcnvme_ls_disconnect_assoc_rqst rq_dis_assoc; ··· 145 144 "Not Disconnect Rqst", 146 145 "Bad Disconnect ACC Length", 147 146 }; 147 + 148 + #define NVME_FC_LAST_LS_CMD_VALUE FCNVME_LS_DISCONNECT_CONN 149 + 150 + static char *nvmefc_ls_names[] = { 151 + "Reserved (0)", 152 + "RJT (1)", 153 + "ACC (2)", 154 + "Create Association", 155 + "Create Connection", 156 + "Disconnect Association", 157 + "Disconnect Connection", 158 + }; 159 + 160 + static inline void 161 + nvmefc_fmt_lsreq_discon_assoc(struct nvmefc_ls_req *lsreq, 162 + struct fcnvme_ls_disconnect_assoc_rqst *discon_rqst, 163 + struct fcnvme_ls_disconnect_assoc_acc *discon_acc, 164 + u64 association_id) 165 + { 166 + lsreq->rqstaddr = discon_rqst; 167 + lsreq->rqstlen = sizeof(*discon_rqst); 168 + lsreq->rspaddr = discon_acc; 169 + lsreq->rsplen = sizeof(*discon_acc); 170 + lsreq->timeout = NVME_FC_LS_TIMEOUT_SEC; 171 + 172 + discon_rqst->w0.ls_cmd = FCNVME_LS_DISCONNECT_ASSOC; 173 + discon_rqst->desc_list_len = cpu_to_be32( 174 + sizeof(struct fcnvme_lsdesc_assoc_id) + 175 + sizeof(struct fcnvme_lsdesc_disconn_cmd)); 176 + 177 + discon_rqst->associd.desc_tag = cpu_to_be32(FCNVME_LSDESC_ASSOC_ID); 178 + discon_rqst->associd.desc_len = 179 + fcnvme_lsdesc_len( 180 + sizeof(struct fcnvme_lsdesc_assoc_id)); 181 + 182 + discon_rqst->associd.association_id = cpu_to_be64(association_id); 183 + 184 + discon_rqst->discon_cmd.desc_tag = cpu_to_be32( 185 + FCNVME_LSDESC_DISCONN_CMD); 186 + discon_rqst->discon_cmd.desc_len = 187 + fcnvme_lsdesc_len( 188 + sizeof(struct fcnvme_lsdesc_disconn_cmd)); 189 + } 190 + 191 + static inline int 192 + nvmefc_vldt_lsreq_discon_assoc(u32 rqstlen, 193 + struct fcnvme_ls_disconnect_assoc_rqst *rqst) 194 + { 195 + int ret = 0; 196 + 197 + if (rqstlen < sizeof(struct fcnvme_ls_disconnect_assoc_rqst)) 198 + ret = VERR_DISCONN_LEN; 199 + else if (rqst->desc_list_len != 200 + fcnvme_lsdesc_len( 201 + sizeof(struct fcnvme_ls_disconnect_assoc_rqst))) 202 + ret = VERR_DISCONN_RQST_LEN; 203 + else if (rqst->associd.desc_tag != cpu_to_be32(FCNVME_LSDESC_ASSOC_ID)) 204 + ret = VERR_ASSOC_ID; 205 + else if (rqst->associd.desc_len != 206 + fcnvme_lsdesc_len( 207 + sizeof(struct fcnvme_lsdesc_assoc_id))) 208 + ret = VERR_ASSOC_ID_LEN; 209 + else if (rqst->discon_cmd.desc_tag != 210 + cpu_to_be32(FCNVME_LSDESC_DISCONN_CMD)) 211 + ret = VERR_DISCONN_CMD; 212 + else if (rqst->discon_cmd.desc_len != 213 + fcnvme_lsdesc_len( 214 + sizeof(struct fcnvme_lsdesc_disconn_cmd))) 215 + ret = VERR_DISCONN_CMD_LEN; 216 + /* 217 + * As the standard changed on the LS, check if old format and scope 218 + * something other than Association (e.g. 0). 219 + */ 220 + else if (rqst->discon_cmd.rsvd8[0]) 221 + ret = VERR_DISCONN_SCOPE; 222 + 223 + return ret; 224 + } 148 225 149 226 #endif /* _NVME_FC_TRANSPORT_H */