]> 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:10:43 +0000 (16:10 +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 0760d0bd8a10b297837acd3d1042a914fe281104..6fcd413c2ac97523219cb02bc82f7bdc1a16aff1 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 0b28d44d3573876c21a5ce1afaf15bacc37ab596..949d20b72ec444db649c14b2c5c7dbb0bf12ab6a 100644 (file)
@@ -793,7 +793,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 2cd2761bd2492c5bb58a7437fe077ea1150805b1..40d93fadd206ce8364ba9fdf27b8f4c15aff229d 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 = 16;
 
index 4498add3d4d664090e29358a9ad505981ae0d110..1ec42c5f0b2a0230a50857a20393fb087bea5f34 100644 (file)
@@ -631,7 +631,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;