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

nvme-fc: Ensure private pointers are NULL if no data

Ensure that when allocations are done, and the lldd options indicate
no private data is needed, that private pointers will be set to NULL
(catches driver error that forgot to set private data size).

Slightly reorg the allocations so that private data follows allocations
for LS request/response buffers. Ensures better alignments for the buffers
as well as the private pointer.

Signed-off-by: James Smart <jsmart2021@gmail.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
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
f56bf76f 3b8281b0

+54 -32
+50 -31
drivers/nvme/host/fc.c
··· 395 395 newrec->ops = template; 396 396 newrec->dev = dev; 397 397 ida_init(&newrec->endp_cnt); 398 - newrec->localport.private = &newrec[1]; 398 + if (template->local_priv_sz) 399 + newrec->localport.private = &newrec[1]; 400 + else 401 + newrec->localport.private = NULL; 399 402 newrec->localport.node_name = pinfo->node_name; 400 403 newrec->localport.port_name = pinfo->port_name; 401 404 newrec->localport.port_role = pinfo->port_role; ··· 707 704 newrec->remoteport.localport = &lport->localport; 708 705 newrec->dev = lport->dev; 709 706 newrec->lport = lport; 710 - newrec->remoteport.private = &newrec[1]; 707 + if (lport->ops->remote_priv_sz) 708 + newrec->remoteport.private = &newrec[1]; 709 + else 710 + newrec->remoteport.private = NULL; 711 711 newrec->remoteport.port_role = pinfo->port_role; 712 712 newrec->remoteport.node_name = pinfo->node_name; 713 713 newrec->remoteport.port_name = pinfo->port_name; ··· 1158 1152 int ret, fcret = 0; 1159 1153 1160 1154 lsop = kzalloc((sizeof(*lsop) + 1161 - ctrl->lport->ops->lsrqst_priv_sz + 1162 - sizeof(*assoc_rqst) + sizeof(*assoc_acc)), GFP_KERNEL); 1155 + sizeof(*assoc_rqst) + sizeof(*assoc_acc) + 1156 + ctrl->lport->ops->lsrqst_priv_sz), GFP_KERNEL); 1163 1157 if (!lsop) { 1158 + dev_info(ctrl->ctrl.device, 1159 + "NVME-FC{%d}: send Create Association failed: ENOMEM\n", 1160 + ctrl->cnum); 1164 1161 ret = -ENOMEM; 1165 1162 goto out_no_memory; 1166 1163 } 1167 - lsreq = &lsop->ls_req; 1168 1164 1169 - lsreq->private = (void *)&lsop[1]; 1170 - assoc_rqst = (struct fcnvme_ls_cr_assoc_rqst *) 1171 - (lsreq->private + ctrl->lport->ops->lsrqst_priv_sz); 1165 + assoc_rqst = (struct fcnvme_ls_cr_assoc_rqst *)&lsop[1]; 1172 1166 assoc_acc = (struct fcnvme_ls_cr_assoc_acc *)&assoc_rqst[1]; 1167 + lsreq = &lsop->ls_req; 1168 + if (ctrl->lport->ops->lsrqst_priv_sz) 1169 + lsreq->private = &assoc_acc[1]; 1170 + else 1171 + lsreq->private = NULL; 1173 1172 1174 1173 assoc_rqst->w0.ls_cmd = FCNVME_LS_CREATE_ASSOCIATION; 1175 1174 assoc_rqst->desc_list_len = ··· 1272 1261 int ret, fcret = 0; 1273 1262 1274 1263 lsop = kzalloc((sizeof(*lsop) + 1275 - ctrl->lport->ops->lsrqst_priv_sz + 1276 - sizeof(*conn_rqst) + sizeof(*conn_acc)), GFP_KERNEL); 1264 + sizeof(*conn_rqst) + sizeof(*conn_acc) + 1265 + ctrl->lport->ops->lsrqst_priv_sz), GFP_KERNEL); 1277 1266 if (!lsop) { 1267 + dev_info(ctrl->ctrl.device, 1268 + "NVME-FC{%d}: send Create Connection failed: ENOMEM\n", 1269 + ctrl->cnum); 1278 1270 ret = -ENOMEM; 1279 1271 goto out_no_memory; 1280 1272 } 1281 - lsreq = &lsop->ls_req; 1282 1273 1283 - lsreq->private = (void *)&lsop[1]; 1284 - conn_rqst = (struct fcnvme_ls_cr_conn_rqst *) 1285 - (lsreq->private + ctrl->lport->ops->lsrqst_priv_sz); 1274 + conn_rqst = (struct fcnvme_ls_cr_conn_rqst *)&lsop[1]; 1286 1275 conn_acc = (struct fcnvme_ls_cr_conn_acc *)&conn_rqst[1]; 1276 + lsreq = &lsop->ls_req; 1277 + if (ctrl->lport->ops->lsrqst_priv_sz) 1278 + lsreq->private = (void *)&conn_acc[1]; 1279 + else 1280 + lsreq->private = NULL; 1287 1281 1288 1282 conn_rqst->w0.ls_cmd = FCNVME_LS_CREATE_CONNECTION; 1289 1283 conn_rqst->desc_list_len = cpu_to_be32( ··· 1402 1386 int ret; 1403 1387 1404 1388 lsop = kzalloc((sizeof(*lsop) + 1405 - ctrl->lport->ops->lsrqst_priv_sz + 1406 - sizeof(*discon_rqst) + sizeof(*discon_acc)), 1407 - GFP_KERNEL); 1408 - if (!lsop) 1409 - /* couldn't sent it... too bad */ 1389 + sizeof(*discon_rqst) + sizeof(*discon_acc) + 1390 + ctrl->lport->ops->lsrqst_priv_sz), GFP_KERNEL); 1391 + if (!lsop) { 1392 + dev_info(ctrl->ctrl.device, 1393 + "NVME-FC{%d}: send Disconnect Association " 1394 + "failed: ENOMEM\n", 1395 + ctrl->cnum); 1410 1396 return; 1397 + } 1411 1398 1412 - lsreq = &lsop->ls_req; 1413 - 1414 - lsreq->private = (void *)&lsop[1]; 1415 - discon_rqst = (struct fcnvme_ls_disconnect_assoc_rqst *) 1416 - (lsreq->private + ctrl->lport->ops->lsrqst_priv_sz); 1399 + discon_rqst = (struct fcnvme_ls_disconnect_assoc_rqst *)&lsop[1]; 1417 1400 discon_acc = (struct fcnvme_ls_disconnect_assoc_acc *)&discon_rqst[1]; 1401 + lsreq = &lsop->ls_req; 1402 + if (ctrl->lport->ops->lsrqst_priv_sz) 1403 + lsreq->private = (void *)&discon_acc[1]; 1404 + else 1405 + lsreq->private = NULL; 1418 1406 1419 1407 discon_rqst->w0.ls_cmd = FCNVME_LS_DISCONNECT_ASSOC; 1420 1408 discon_rqst->desc_list_len = cpu_to_be32( ··· 1804 1784 struct nvme_fc_fcp_op *aen_op; 1805 1785 struct nvme_fc_cmd_iu *cmdiu; 1806 1786 struct nvme_command *sqe; 1807 - void *private; 1787 + void *private = NULL; 1808 1788 int i, ret; 1809 1789 1810 1790 aen_op = ctrl->aen_ops; 1811 1791 for (i = 0; i < NVME_NR_AEN_COMMANDS; i++, aen_op++) { 1812 - private = kzalloc(ctrl->lport->ops->fcprqst_priv_sz, 1792 + if (ctrl->lport->ops->fcprqst_priv_sz) { 1793 + private = kzalloc(ctrl->lport->ops->fcprqst_priv_sz, 1813 1794 GFP_KERNEL); 1814 - if (!private) 1815 - return -ENOMEM; 1795 + if (!private) 1796 + return -ENOMEM; 1797 + } 1816 1798 1817 1799 cmdiu = &aen_op->cmd_iu; 1818 1800 sqe = &cmdiu->sqe; ··· 1845 1823 1846 1824 aen_op = ctrl->aen_ops; 1847 1825 for (i = 0; i < NVME_NR_AEN_COMMANDS; i++, aen_op++) { 1848 - if (!aen_op->fcp_req.private) 1849 - continue; 1850 - 1851 1826 __nvme_fc_exit_request(ctrl, aen_op); 1852 1827 1853 1828 kfree(aen_op->fcp_req.private);
+4 -1
drivers/nvme/target/fc.c
··· 1047 1047 1048 1048 newrec->fc_target_port.node_name = pinfo->node_name; 1049 1049 newrec->fc_target_port.port_name = pinfo->port_name; 1050 - newrec->fc_target_port.private = &newrec[1]; 1050 + if (template->target_priv_sz) 1051 + newrec->fc_target_port.private = &newrec[1]; 1052 + else 1053 + newrec->fc_target_port.private = NULL; 1051 1054 newrec->fc_target_port.port_id = pinfo->port_id; 1052 1055 newrec->fc_target_port.port_num = idx; 1053 1056 INIT_LIST_HEAD(&newrec->tgt_list);