scsi: iscsi: Fix shost->max_id use
authorMike Christie <michael.christie@oracle.com>
Tue, 25 May 2021 18:18:07 +0000 (13:18 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 2 Jun 2021 05:28:21 +0000 (01:28 -0400)
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>
drivers/scsi/be2iscsi/be_main.c
drivers/scsi/bnx2i/bnx2i_iscsi.c
drivers/scsi/cxgbi/libcxgbi.c
drivers/scsi/qedi/qedi_main.c

index 58f81a79088f6d2db35172830dd0aa609e2cbb9d..310b801c6c87a71b56ea60ff3d4174234d75bf7d 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;
@@ -5316,7 +5316,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 26cb1c6536cef42e978f138e3f1fbb6a0251338e..1b5f3e143f0710bb6fba089f5b2f389c6aaf2270 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 dbe22a7136f3c42741e384eef709f54a7453e902..8c7d4dda4cf29944c5f73a487852b818112103e1 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 2455d1448a7e3772d6f2648a4c814cb6c83d2881..edf91543270485d9393d5d6bf0ddbe169ae1b640 100644 (file)
@@ -640,7 +640,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;