]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: iscsi: Fix shost->max_id use
authorMike Christie <michael.christie@oracle.com>
Tue, 25 May 2021 18:18:07 +0000 (13:18 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 Jul 2021 14:02:07 +0000 (16:02 +0200)
[ Upstream commit bdd4aad7ff92ae39c2e93c415bb6761cb8b584da ]

The iscsi offload drivers are setting the shost->max_id to the max number
of sessions they support. The problem is that max_id is not the max number
of targets but the highest identifier the targets can have. To use it to
limit the number of targets we need to set it to max sessions - 1, or we
can end up with a session we might not have preallocated resources for.

Link: https://lore.kernel.org/r/20210525181821.7617-15-michael.christie@oracle.com
Reviewed-by: Lee Duncan <lduncan@suse.com>
Signed-off-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/be2iscsi/be_main.c
drivers/scsi/bnx2i/bnx2i_iscsi.c
drivers/scsi/cxgbi/libcxgbi.c
drivers/scsi/qedi/qedi_main.c

index e9658a67d9da09a60b23be6019581b060f14750a..09d2f8351539b75e067c1d609a665273487d989c 100644 (file)
@@ -416,7 +416,7 @@ static struct beiscsi_hba *beiscsi_hba_alloc(struct pci_dev *pcidev)
                        "beiscsi_hba_alloc - iscsi_host_alloc failed\n");
                return NULL;
        }
-       shost->max_id = BE2_MAX_SESSIONS;
+       shost->max_id = BE2_MAX_SESSIONS - 1;
        shost->max_channel = 0;
        shost->max_cmd_len = BEISCSI_MAX_CMD_LEN;
        shost->max_lun = BEISCSI_NUM_MAX_LUN;
@@ -5318,7 +5318,7 @@ static int beiscsi_enable_port(struct beiscsi_hba *phba)
        /* Re-enable UER. If different TPE occurs then it is recoverable. */
        beiscsi_set_uer_feature(phba);
 
-       phba->shost->max_id = phba->params.cxns_per_ctrl;
+       phba->shost->max_id = phba->params.cxns_per_ctrl - 1;
        phba->shost->can_queue = phba->params.ios_per_ctrl;
        ret = beiscsi_init_port(phba);
        if (ret < 0) {
index 2ad85c6b99fd291cca45b28eb0cc58e64db8174c..8cf2f9a7cfdc20cdab472cf5c9104d2928e6b1e8 100644 (file)
@@ -791,7 +791,7 @@ struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic)
                return NULL;
        shost->dma_boundary = cnic->pcidev->dma_mask;
        shost->transportt = bnx2i_scsi_xport_template;
-       shost->max_id = ISCSI_MAX_CONNS_PER_HBA;
+       shost->max_id = ISCSI_MAX_CONNS_PER_HBA - 1;
        shost->max_channel = 0;
        shost->max_lun = 512;
        shost->max_cmd_len = 16;
index f6bcae829c29b3bdef8b22c4f69c2fc3d268925c..506b561670af0f917b1d25ed4cb90b6eaef10b4e 100644 (file)
@@ -337,7 +337,7 @@ void cxgbi_hbas_remove(struct cxgbi_device *cdev)
 EXPORT_SYMBOL_GPL(cxgbi_hbas_remove);
 
 int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,
-               unsigned int max_id, struct scsi_host_template *sht,
+               unsigned int max_conns, struct scsi_host_template *sht,
                struct scsi_transport_template *stt)
 {
        struct cxgbi_hba *chba;
@@ -357,7 +357,7 @@ int cxgbi_hbas_add(struct cxgbi_device *cdev, u64 max_lun,
 
                shost->transportt = stt;
                shost->max_lun = max_lun;
-               shost->max_id = max_id;
+               shost->max_id = max_conns - 1;
                shost->max_channel = 0;
                shost->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE;
 
index 69c5b5ee2169bffedba10eb35d7aadd6cbf32bee..b33eff9ea80baa9cae94c2f3ac879c6708ddd605 100644 (file)
@@ -642,7 +642,7 @@ static struct qedi_ctx *qedi_host_alloc(struct pci_dev *pdev)
                goto exit_setup_shost;
        }
 
-       shost->max_id = QEDI_MAX_ISCSI_CONNS_PER_HBA;
+       shost->max_id = QEDI_MAX_ISCSI_CONNS_PER_HBA - 1;
        shost->max_channel = 0;
        shost->max_lun = ~0;
        shost->max_cmd_len = 16;